等待未来,接受任何一个

sch*_*mmd 27 scala future

我想等待可能失败的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)

  • 我认为这是更好的解决方案: `Await.ready(f, Duration.Inf).onComplete(result => { result match { case Success(t) => Right(t) case Failure(e) => Left(e)在 Option 上调用 **get** 通常是一个坏主意 (2认同)
  • @KevinMeredith(哎呀,意思是“Await.result 的问题”) (2认同)