如何阻塞线程并从Future[A]获得Try[A] ?



我有List[Future[A]]。我想阻塞我的线程并立即获得List[Try[A]]。找不到好的解决办法。

您可以使用Await:https://www.scala-lang.org/api/2.13.3/scala/concurrent/Await $ . html

import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.Try
val res = Try(Await.result(someFuture, 10.seconds))

也就是说,阻塞很少是一个好主意。期货应该用flatMap等方法组成。

既然你已经澄清了你的问题(在我的另一个答案的评论中),这里有一种可能性:

import scala.util._
import scala.concurrent._
def partitionFutures[A](
l: List[Future[A]])(
implicit ec: ExecutionContext
): Future[(List[A], List[Throwable])] = {
Future.traverse(l)(_.transform(Success.apply)).map { (trys: List[Try[A]]) =>
val as = trys.collect { case Success(a) => a }
val errs = trys.collect { case Failure(err) => err }
as -> errs
}
}

该类型与您建议的类型不完全相同,但不清楚为什么您想要一个列表对的列表,因此我将其简化为一对列表。

最新更新