在 Scala 中,我可以获取一个值列表,在它们之间映射一个未来返回函数,并返回一个将这些未来值收集到一个列表中的未来(或因第一个错误而失败)。更具体地说:
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
def doSomething(i: Int): Future[Int] = future(i + 1) // Not really doing much.
val incremented = Future.traverse(List(1, 2, 3))(doSomething)
在这种情况下,结果将只是增加的列表:
scala> incremented.onSuccess { case xs => println(xs) }
List(2, 3, 4)
我也可以创建一个期货列表,然后将它们变成包含相同结果的未来:
val incremented = Future.sequence(List(1, 2, 3).map(doSomething))
这会给我同样的东西,但它会创建一个额外的中间集合,并且会更嘈杂。
我想用Q中的承诺做这样的事情,看起来Q.all
或多或少sequence
:
function doSomething(i) { return Q.fcall(function () { return i + 1; }); }
Q.all([1, 2, 3].map(doSomething)).then(function (xs) { console.log(xs) })
有没有办法让我写一个更像traverse
的版本?这是一个如此基本的操作,似乎必须有办法做到这一点,但这是我与 Q 的第一个下午,我仍在努力克服fcall
和朋友的所有重载。