簡體   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