我有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
}
}
该类型与您建议的类型不完全相同,但不清楚为什么您想要一个列表对的列表,因此我将其简化为一对列表。