如何编写“期货”列表?
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都满足时才会满足。
我有 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都满足时才会满足。