【问题标题】:Can I push new promise into array in the middle of Promise.all()?我可以在 Promise.all() 中间将新的承诺推入数组吗?
【发布时间】:2019-10-26 13:09:04
【问题描述】:

我试图弄清楚 Promise.all 是如何工作的。 我的问题是:可以将 Promise.all() 中间的新承诺推送到之前传递的同一个数组中吗? 例如,我有这段代码可以正常工作: https://jsfiddle.net/artheg/z0Lndw1o/14/

const promises = [];
const promise1 = new Promise(function(resolve, reject) {
  resolve('promise1');
  const promise2 = new Promise(function(resolve, reject) {
    resolve('promise2');
  });
  pushPromise(promise2); // Pushing promise2 to the same array after the promise1 was resolved
});

pushPromise(promise1); // Pushing promise1

function pushPromise(promise) {
  promises.push(promise);
}

Promise.all(promises).then(function(values) {
  console.log(values); // Array [ "promise2", "promise1" ]
});

这种行为是有意的,还是我应该总是用 .then() 链接 Promise 而不是将新的 Promise 推入数组?

【问题讨论】:

  • 您的代码没有在“在 Promise.all() 中间”的数组中添加 Promise。它完全构建数组,然后在完成后将其传递给 Promise.all()。

标签: javascript promise


【解决方案1】:

promise 执行器中的代码(您传递的函数new Promise同步运行。所以pushPromise(promise2) 在你调用Promise.all 之前已经运行了。在您调用 Promise.all 时,该数组已被填满。

我可以在 Promise.all() 中间将新的 Promise 推入数组吗?

如果你想让Promise.all 看到那个承诺,那就不行。请参阅the specificationPromise.all 循环遍历您同步传递它的可迭代对象,在返回之前以及在它(Promise.all)在承诺上设置的任何处理程序之前可以调用。

这是一个示例,请注意来自Promise.all 的承诺已实现而不是拒绝,即使代码向它拒绝的数组添加了一个承诺:

const promises = [
    Promise.resolve(1),
    Promise.resolve(2).finally(() => {
        promises.push(Promise.reject(new Error("failed")));
    }),
    Promise.resolve(3),
];
Promise.all(promises)
.then(results => {
    console.log(`results (${results.length}): ${results.join(", ")}`);
    console.log(`promises.length: ${promises.length}`);
})
.catch(error => {
    console.error(error);
});

【讨论】:

    【解决方案2】:

    这是因为您将 Promise 推送到数组同步Promise.all 与传入时数组中的 Promise 一起工作。

    异步添加的 Promise 示例:

     const promises = [Promise.resolve(1)];
    
     setTimeout(() => promises.push(Promise.resolve(2)), 0);
    
     Promise.all(promises).then(console.log); // [1]
    

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2017-06-22
      • 2016-11-25
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2020-04-25
      • 2019-01-05
      • 1970-01-01
      相关资源
      最近更新 更多