如何将 `getOrWaitUntilNonEmpty` 作为单行执行? [英] How to do a `getOrWaitUntilNonEmpty` as a single liner?

查看:44
本文介绍了如何将 `getOrWaitUntilNonEmpty` 作为单行执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的高级代码结构:

I have a high-level code structure that looks like this:

val block: (=> Option[Seq[String]]) = ...
val matches = block().get.toArray

问题是此代码可能会失败,即 .getNone 取决于时间,例如我页面抓取谷歌太频繁了,然后我会等待并重试......

The problem is that this code may fail i.e. .get being None depending on the time e.g. I'm page-scraping Google too often, then I'd wait and retry ...

我可以像这样等待,即在 11-16 秒之间随机等待:

I can do the waiting like this i.e. random waits between 11-16s:

val random = new Random()
Thread.sleep((11000 * random.nextFloat() + 6000).ceil.toInt)

在执行 block 的结果不为空之前,[waiting] 循环的优雅单行方式是什么?类似的东西:

What would be an elegant single-liner way to [waiting] loop until the result of executing block isn't empty? Something like:

val timeInMillis = (11000 * random.nextFloat() + 6000).ceil.toInt
block().getOrWaitUntilNonEmpty(timeInMillis).toArray

推荐答案

尝试 softwaremill/retry像这样

retry.Pause(max = 10, Defaults.delay)(odelay.Timer.default) {
  block
}

有依赖关系

"com.softwaremill.retry"  %% "retry"       % "0.3.2"
"com.softwaremill.odelay" %% "odelay-core" % "0.3.0"

这篇关于如何将 `getOrWaitUntilNonEmpty` 作为单行执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆