繁体   English   中英

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

[英]How to dynamically add new promise to the promises chain

我想创建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和这个网站

 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); 
[编辑]:另一种方式

 var delays = [0, 1000, 2000, 3000, 4000]; var currentPromise = Promise.resolve(); for (let i = 0; i < delays.length; i++) { // let makes i block scope .. var would not have done that currentPromise = currentPromise.then(function() { return launchChain(delays[i]); }); } function launchChain(delay) { return new Promise(function(resolve, reject) { setTimeout(function() { console.log(delay); resolve(); }, delay); }); } 

如果这对你有用,请告诉我:)由于这个问题,我学到了很多东西!

谢谢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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM