等待所有嵌套的 Futures 完成

ses*_*ses 1 scala future

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)

但我想它并不像它应有的那样高效。

Pet*_*ens 5

您不应该嵌套多个Futures,通常您会使用map, flatMap, 进行推导, ... 将异步操作链接Futures在一起使用。

如果你想继续你的Seq[Future[Seq[Future[String]]]],你可以使用Future.sequenceSeq.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)