我有一个集合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]在满足所有期货时将满足的情况.