我想等待一个可能失败的scala future 。如果我使用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) }
来获取,但是必须有更直接的方法。
最佳答案
您可以使用Await.ready
,它仅阻塞直到Future成功或失败,然后将引用返回给该Future。
从那里,您可能想要获取Future的value
,它是Option[Try[T]]
。由于存在Await.ready
调用,因此可以安全地假设value
是Some
。然后,只需在Try[T]
和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)
}
关于scala - 等待 future ,得到一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417317/