javascript - 遍历 Q 中的 promise

标签 javascript asynchronous future promise q

在 Scala 中,我可以获取一个值列表,在它们之间映射一个返回 future 的函数,然后返回一个将这些 future 的值收集到列表中的 future (或者因第一个错误而失败)。更具体地说:

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)

我也可以创建一个 future 列表,然后将它们变成包含相同结果的 future :

val incremented = Future.sequence(List(1, 2, 3).map(doSomething))

这会给我同样的结果,但它会创建一个额外的中间集合,并且会更加嘈杂。

我想用 Q 中的 promise 做这样的事情,看起来 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 和 friend 的所有重载。

最佳答案

不是您问题的直接答案,但 AngularJS 使用 Q 的极简化版本($q),因此您肯定必须自己实现此行为。

这是一种方法:

var traverse = function(fn /*values*/) {
  var values = _.rest(arguments);
  var promises = _.map(values, fn);
  return $q.all(promises);
};

完整示例:http://plnkr.co/edit/PGp7QbQYMjOknJwSEn8E

或者在 Scala 中使用单独的参数列表:

  var traverse = function(/*values*/) {
    var values = arguments;
    return function(fn) {
      var promises = _.map(values, fn);
      return $q.all(promises);  
    }
  };

完整示例:http://plnkr.co/edit/pWoGGaZobbx61tAmUWr9?p=preview

关于javascript - 遍历 Q 中的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004360/

相关文章:

javascript - 为什么一些导入的 React-Native Redux 操作会多次更改值并触发 onEffects?

r - 使用带有 Shiny、R 和 future 的外部类

multithreading - 产生线程并获得 future 结果的最佳方法是什么?

javascript - 如何向网络应用程序和浏览器发送推送通知?

javascript - 使用 connect.query() 在 nodejs 中查询 url

nativemessaging 应用程序和 webextension 之间的异步双向消息传递?

java - 根据任务结果取消计划的固定费率任务

javascript - 如何将 HTML 元素锚定在其他两个元素之间的中心?

javascript - D3 在鼠标悬停时更改路径描边的颜色

Python 3.5 async/await 与真实代码示例