我有一个集合Promises
.我一直在寻找一种有效的方法来组成结果Futures
.目前我发现将它们组合起来最干净的方法是使用scalaz Monoid
,如下所示:
val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])
promises.map(_.future).reduce(_ |+| _).onSuccess {
case a => println(a)
}
promises.foreach(_.success(()))
Run Code Online (Sandbox Code Playgroud)
有没有一个干净的方法来做这个不需要scalaz?
Futures
集合中的数量会有所不同,许多中间集合是不可取的.
你可以使用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)
Run Code Online (Sandbox Code Playgroud)
这将给你一个Future[List[Unit]]
,它不完全符合"许多中间集合"的资格,但也不一定是理想的.Future.reduce
也有效:
Future.reduce(promises.map(_.future))((_, _) => ())
Run Code Online (Sandbox Code Playgroud)
这将返回Future[Unit]
在满足所有期货时将满足的情况.