中的遍歷承諾在Scala中,我可以獲取一個值列表,在它們之間映射一個未來返回函數,並找回一個未來將這些期貨的價值收集到一個列表中(或者以第一個錯誤失敗) 。更具體地說:在Q
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
和朋友的所有重載。
@LeeMeador:Q是一個JavaScript庫 - 我只是給Scala代碼來演示wha我想要這樣做。 –
你確實注意到JavaScript(和Q庫)不是並行執行,而只是異步執行?它只有在doSomething是一個異步任務時纔有用(回調函數和一些並行的東西在後臺運行)。 – Bergi