【问题标题】:Dynamic array promise sequence动态数组承诺序列
【发布时间】:2017-07-02 16:06:11
【问题描述】:

我正在变得动态(每个运行时的承诺数量可以更改)承诺数组,现在我希望在每次解决或拒绝之后 处理返回的承诺 before 承诺数组将完成。

我尝试 promise all,但在所有承诺完成后它会继续。

如果(承诺的)数组不是动态的,那么我可以简单地使用这样的东西 但我不知道我在数组中有多少承诺,并且我希望在每个承诺都履行或......继续它的答案并且不要等到所有承诺都完成

firstMethod()
   .then(secondMethod)
   .then(thirdMethod);

我们正在使用 Q ...

有可能吗?

更新(示例)

假设我有一个承诺数组

[promise1,promise2,promise3, promiseN]

现在我希望 promise1 完成处理时用 then 处理它,而不是等待所有承诺都完成。

这里最大的问题是数组可以有 N 个承诺,我不知道在 RT 中我会得到多少承诺,直到我得到这个数组因此我不能简单地使用

更新 2(澄清一点 :-))棘手的部分...

如果我事先知道数组的大小,我可以简单地使用 then ,数组 5 链中的 5 个条目与 then 但这里棘手的部分是我事先不知道我将在承诺数组中拥有多少承诺....

【问题讨论】:

  • 这个问题对你的意思不够清楚。更多的代码会更合适。有没有promiseArray.map(promise => promise.then(...))解决不了的问题?
  • 你问的是承诺链吗?一些代码示例将有助于更好地理解问题。
  • @estus - 谢谢,我会添加额外的示例,您能否提供完整的示例 /jsfiddle,因为不确定我是否理解您放置的代码是如何工作的......
  • @estus - 添加示例请查看它是否能澄清问题。
  • 请澄清您所说的“我希望在每个承诺都实现后或......继续回答它”的意思。在“类似这样”的示例中,您根本没有多个 Promise,而是有多个 方法。那么你的数组实际上包含什么?

标签: javascript node.js ecmascript-6 promise q


【解决方案1】:

如果您不需要链接承诺。你可以这样做:

var tasks = [[promise1, handler1], [promise2, handler2], [promise3, handler3]];

tasks.forEach(function (task) {
  var promise = task[0];
  var handler = task[1];
  promise.then(handler)
});

【讨论】:

    【解决方案2】:

    如果目标是用相同的then 链接每个promise,但不等待所有promise 完成,这只是一个循环:

    for (const promise of promiseArray) {
      promise.then(...)
    }
    

    如果promise结果最后要拼接在一起,数组可以被all额外处理:

    Promise.all(promiseArray.map(promise => promise.then(...)))
    .then(...)
    

    请注意,all 的行为适用于此。如果 Promise 数组中有未捕获的拒绝,则只会捕获第一个拒绝。

    对于大多数 Promise 实现来说都是如此。可能有 Q 方法可以更轻松地做到这一点。

    【讨论】:

      【解决方案3】:

      你可以使用Promise.race()

      Promise.race(iterable) 方法返回一个 Promise,只要 iterable 中的一个 Promise 解析或拒绝,该 Promise 就会解析或拒绝,并带有来自该 Promise 的值或原因。

      var p1 = new Promise(function(resolve, reject) { 
          setTimeout(resolve, 500, 'one'); 
      });
      var p2 = new Promise(function(resolve, reject) { 
          setTimeout(resolve, 100, 'two'); 
      });
      
      Promise.race([p1, p2]).then(function(value) {
        console.log(value); // "two"
        // Both resolve, but p2 is faster
      });
      

      【讨论】:

      • 谢谢,但我需要处理数组中的所有承诺,而不仅仅是第一个被重新处理的承诺,如果我有 N 组承诺,我该如何处理你的建议?
      猜你喜欢
      • 2014-08-30
      • 2018-05-11
      • 2017-11-07
      • 2014-08-07
      • 2016-05-16
      • 2018-08-05
      • 2016-06-17
      • 2018-08-06
      相关资源
      最近更新 更多