首页 > 解决方案 > 如何多次重复等待?

问题描述

我是 Scala 的新手。我只想在code1超时时重试。如果出现另一个错误,我会以另一种方式处理。如果超时,我想再试一次,比如3次。这样做的正确方法是什么?

我不确定code2在 Scala 上使用类似的东西是否是最好的方法。也许已经有更好的东西了。有没有更干净的破解方法?我应该使用 Await.ready 而不是结果吗?

我也不确定是否应该使用 Await.ready 或 Await.result。

代码1:

Await.result(myMethod(), Duration(120, "seconds"))

代码2:

breakable {
  for(_ <- 0 to 3) {
    Try(Await.result(myMethod(), Duration(120, "seconds"))) match {
      case Success(value) => {
        // do something
        break()
      }
       case Failure(_) => // how can I now if it is timeout?
    }
  }
}

标签: scalafuture

解决方案


等待 aFuture使整个Future事情变得毫无意义。话虽如此,有3种情况应该处理:

  1. 所有尝试都超时
  2. 非超时失败
  3. aFuture成功完成
import scala.concurrent.duration._
import scala.concurrent.{Future, Await, TimeoutException}
import scala.util.{Try, Success, Failure}

//            v--max number of attempts
LazyList.fill(4)(Try(Await.result(myMethod(), 120.seconds)))
  .dropWhile{case Failure(_:TimeoutException) => true
             case _ => false
  }.headOption.fold{
    //every attempt timed out
  }{
    case Success(value) => //do something
    case Failure(ex:Throwable) => //ex is non-timeout exception
  }

注意:LazyList是 Scala 2.13.x 集合。列表中的每个元素仅在需要时才评估,因此如果第一个成功,则不会启动其他期货。


推荐阅读