如何动态地向promises链添加新的承诺

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何动态地向promises链添加新的承诺相关的知识,希望对你有一定的参考价值。

我想创建promises链,然后根据需要动态添加尽可能多的promises。这些添加可能在一些循环中具有动态步数,因此我不能使用链接,如.then()。then()。然后...代码bellow工作不正常,但你会得到这个想法。结果应该是一个控制台在3,4和5秒内记录了3000,4000,5000个数字,但实际上并不是这样。有任何想法吗?

let launchChain = function(delay)
{
  return new Promise((resolve: Function, reject: Function) => {
    setTimeout(() => {
      console.log(delay);
      resolve();
    }, delay)
  })
}

let chain = launchChain(3000);

chain.then(function () {
  return launchChain(4000);
})

chain.then(function () {
  return launchChain(5000);
})
答案
function run(delay){
    let chain = launchChain(delay);
    chain.then(function() {
        run(delay+1000);
    });
}


run(3000);
另一答案

所以使用了reduce和这个site

var delays = [0, 1000, 2000, 3000, 4000];

function workMyCollection(arr) {
  return arr.reduce(function(promise, item) {
    return promise.then(function() {
      return launchChain(item);
    });
    // uses this orignal promise to start the chaining.
  }, Promise.resolve());
}

function launchChain(delay) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log(delay);
      resolve();
    }, delay);
  });
}

workMyCollection(delays);
另一答案

谢谢sinhavartika!有用!但我实际上从这里https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce举了一些例子并稍微改了一下,现在我用以下方式在我的项目中使用它:

  /**
   * Runs promises from promise array in chained manner
   *
   * @param {array} arr - promise arr
   * @return {Object} promise object
   */
  function runPromiseInSequense(arr) {
    return arr.reduce((promiseChain, currentPromise) => {
      return promiseChain.then((chainedResult) => {
        return currentPromise(chainedResult)
          .then((res) => res)
      })
    }, Promise.resolve());
  }

  var promiseArr = [];

  function addToChain(delay)
  {
    promiseArr.push(function (delay) {
      return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log(delay);
            resolve();
          }, delay)
      });
    }.bind(this, delay))
  }

  addToChain(1000);
  addToChain(2000);
  addToChain(3000);
  addToChain(4000);

  runPromiseInSequense(promiseArr);

以上是关于如何动态地向promises链添加新的承诺的主要内容,如果未能解决你的问题,请参考以下文章

承诺链中承诺之间的延迟

如何使用链调用 Promise?

如何在 Express 中修复这个 ES6 承诺链?

如何知道所有 Promise 何时在动态“可迭代”参数中得到解决?

Request-Promise:承诺缓存结果

如何动态地向数组中存数据,而且新的覆盖老的。