我想等待可能失败的scala未来.如果我使用Await.result异常将被抛出.相反,如果我有,f: Future[String]我想要一个方法Await.resultOpt(f): Option[String]或Await.resultEither(f): Either[String].
我可以通过使用scala.util.control.Exception.catching或我可以得到这个f map (Right(_)) recover { case t: Throwable => Left(t) },但必须有一个更直接的方式.
Dyl*_*lan 60
您可以使用Await.ready哪个简单地阻塞,直到Future成功或失败,然后返回一个返回到Future的引用.
从那里,你可能想要获得Future's value,这是一个Option[Try[T]].由于这个Await.ready电话,应该可以安全地假设它value是a Some.那么这只是a Try[T]和a之间映射的问题Either[Throwable, T].
简短版本:
val f: Future[T] = ...
val result: Try[T] = Await.ready(f, Duration.Inf).value.get
val resultEither = result match {
case Success(t) => Right(t)
case Failure(e) => Left(e)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29519 次 |
| 最近记录: |