Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向承诺链动态添加新承诺_Javascript_Promise - Fatal编程技术网

Javascript 如何向承诺链动态添加新承诺

Javascript 如何向承诺链动态添加新承诺,javascript,promise,Javascript,Promise,我想创建承诺链,然后根据需要动态地向其中添加尽可能多的承诺。这些添加可能是在一个动态步骤数的循环中,这样我就不能使用chain-like.then().then().then。。。代码贝娄工作不正常,但你会得到的想法。结果应该是控制台在3、4和5秒内记录了3000、4000、5000个数字,但实际上并不是这样。有什么想法吗 let launchChain = function(delay) { return new Promise((resolve: Function, reject: Fu

我想创建承诺链,然后根据需要动态地向其中添加尽可能多的承诺。这些添加可能是在一个动态步骤数的循环中,这样我就不能使用chain-like.then().then().then。。。代码贝娄工作不正常,但你会得到的想法。结果应该是控制台在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);
})
所以用这个

var延迟=[0,1000,2000,3000,4000];
功能workMyCollection(arr){
返回arr.reduce(功能(承诺、项目){
return promise.then(函数(){
返回启动链(项目);
});
//使用此原始承诺开始链接。
},Promise.resolve());
}
功能启动链(延迟){
返回新承诺(功能(解决、拒绝){
setTimeout(函数(){
控制台日志(延迟);
解决();
},延误);
});
}

workMyCollection(延迟)谢谢sinhavartika!它起作用了!但我实际上从这里举了个例子 并对其进行了一些更改,现在我以以下方式将其用于我的项目中:

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

chain=chain.then….
?一旦得到解决,您就无法重新打开它。您必须在外部执行轮询Jaromanda X,在代码本身中就是这样做的。但它工作不正常。运行它,您将看到)您能告诉我们,在提供的代码中,哪些地方不能正常工作吗?控制台为我记录“3000、4000、5000个数字在3、4和5秒内完成”。David,5000个数字在4000个数字之后在一秒钟内完成记录,而不是5个。它似乎是chain.then(函数(){return launchChain(4000);})chain.then(函数(){return launchChain(5000);})同时启动的,您想做什么还不清楚。。但是如果它对你有效,那么如果它很棒!
  /**
   * 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);