4

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

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

问题是这段代码可能会失败,即.get取决于None时间,例如我经常抓取谷歌页面,然后我会等待并重试......

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

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

什么是优雅的单线方式来[等待]循环,直到执行结果block不为空?就像是:

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

1 回答 1

2

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"
于 2019-05-22T12:54:06.140 回答