Future.sequence如何运作?

时间:2016-06-01 13:50:49

标签: scala

在Scala中,我想将List[Future[T]]类型的变量转换为Future[List[T]]

我知道我可以使用Future.sequence

如何实施Future.sequence

1 个答案:

答案 0 :(得分:1)

Like this

/** Simple version of `Futures.traverse`. 
 *  Transforms a `TraversableOnce[Future[A]]` into a `Future[TraversableOnce[A]]`.
 *  Useful for reducing many `Future`s into a single `Future`.
 */
def sequence[A, M[X] <: TraversableOnce[X]]
            (in: M[Future[A]])
            (implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], 
             executor: ExecutionContext): Future[M[A]] = {
  in.foldLeft(successful(cbf(in))) {
    (fr, fa) => for (r <- fr; a <- fa) yield (r += a)
  }.map(_.result())(InternalCallbackExecutor)
}

使用FuturefoldLeft创建种子Promise.successful,然后使用CanBuildFrom将所有未来累积到序列中,从而产生积累的结果端。