2015-08-23 114 views
0
val works: Seq[Future[Seq[Future[String]]]] = ... 

如何等待所有這些頂部和嵌套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 
) 

但我想它並不像effiecient,因爲它可以。

+2

如何做一個結了'序列[未來[序列[未來[字符串]]]]在第一個地方? –

+0

@mz https://github.com/Sergey80/scala-samples/blob/master/src/main/scala/concurrency/NestedFutures.scala – ses

+0

是的,儘管嵌套代數數據結構並遞歸匹配它是個好主意,但未來不是ADT。你最好儘快把它們弄平 – ipoteka

回答

3

你不應該嵌套多個Futures,通常你會mapflatMap爲內涵,以...連鎖異步操作使用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)