val works: Seq[Future[Seq[Future[String]]]] = ...
Run Code Online (Sandbox Code Playgroud)
我将如何等待所有这些顶部和嵌套Futures完成?
我的第一个想法是:
val result1: Seq[Seq[Future[String]]] = Await.result(
Future.sequence(works), Duration.Inf
)
val result2: Seq[String] = Await.result(
Future.sequence(result1.flatten), Duration.Inf
)
Run Code Online (Sandbox Code Playgroud)
但我想它并不像它应有的那样高效。
您不应该嵌套多个Futures,通常您会使用map, flatMap, 进行推导, ... 将异步操作链接Futures在一起使用。
如果你想继续你的Seq[Future[Seq[Future[String]]]],你可以使用Future.sequence和Seq.flatten函数来创建一个Future[Seq[String]]:
import scala.concurrent.{Future, Await}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
val works = Seq(Future.successful(Seq(Future.successful("abc"))))
val onlyOneFuture: Future[Seq[String]] =
Future.sequence(works).map(_.flatten).flatMap(Future.sequence(_))
Await.result(onlyOneFuture, 5.seconds)
// Seq[String] = List(abc)
Run Code Online (Sandbox Code Playgroud)