简体   繁体   English

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

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

I want to create promises chain and then dynamically add as many promises to it as it's needed. 我想创建promises链,然后根据需要动态添加尽可能多的promises。 These additions could be in some cycle with dynamic number of steps so that I can't use chain like .then().then().then... Code bellow works improperly but you'll get the idea. 这些添加可能在一些循环中具有动态步数,因此我不能使用链接,如.then()。then()。然后...代码bellow工作不正常,但你会得到这个想法。 Result should be a console logged 3000, 4000, 5000 numbers in 3, 4 and 5 seconds consequently but actually doesn't work that way. 结果应该是一个控制台在3,4和5秒内记录了3000,4000,5000个数字,但实际上并不是这样。 Any ideas? 有任何想法吗?

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

So used reduce and this site 所以使用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); 
[EDIT] : Another way [编辑]:另一种方式

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

Do let me know if this worked for you :) thanks to this question I learned a lot! 如果这对你有用,请告诉我:)由于这个问题,我学到了很多东西!

Thanks sinhavartika! 谢谢sinhavartika! It works! 有用! But I actually took example from here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce and changed it a bit and now I use it in my project in the following way: 但我实际上从这里举了个例子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