如何编写“期货”列表?

How do I compose a list of `Futures`?

我有 Promises 个 collection。我一直在寻找一种有效的方法来组成结果 Futures。目前我发现将它们结合起来的最干净的方法是使用 scalaz Monoid,像这样:

  val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])

  promises.map(_.future).reduce(_ |+| _).onSuccess {
    case a => println(a)
  }  

  promises.foreach(_.success(()))

有没有不需要 scalaz 的干净方法?

collection 中 Futures 的数量会有所不同,大量中间 collection 是不可取的。

Future.sequence就是你想要的方法。

您可以使用 Future.traverse:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ Future, Promise }

val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])
Future.traverse(promises)(_.future)

这会给你一个 Future[List[Unit]],它不完全符合 "lots of intermediate collections",但也不一定是理想的。 Future.reduce 也有效:

Future.reduce(promises.map(_.future))((_, _) => ())

这个returns一个Future[Unit],当所有的futures都满足时才会满足。