簡體   English   中英

我可以將新的 promise 推入 Promise.all() 中間的數組嗎?

[英]Can I push new promise into array in the middle of Promise.all()?

我試圖弄清楚 Promise.all 是如何工作的。 我的問題是:可以將 Promise.all() 中間的新 promise 推送到之前傳遞的同一個數組中嗎? 例如,我有這個工作得很好的代碼: 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.all與傳入時數組中的 Promise 一起工作。

異步添加的 Promise 示例:

 const promises = [Promise.resolve(1)];

 setTimeout(() => promises.push(Promise.resolve(2)), 0);

 Promise.all(promises).then(console.log); // [1]

promise 執行器中的代碼(您傳遞new Promise同步運行。 所以pushPromise(promise2)在你調用Promise.all之前已經運行了。 在您調用Promise.all時,該數組已被填滿。

我可以將新的 promise 推入 Promise.all() 中間的數組嗎?

如果您希望Promise.all看到 promise,則不是。 請參閱規范Promise.all循環遍歷您同步傳遞它的可迭代對象,在返回之前以及在任何處理程序之前,它( Promise.all )設置在可以調用的承諾上。

這是一個示例,請注意,來自 Promise.all 的Promise.all已實現而不是拒絕,即使代碼將 promise 添加到它拒絕的數組中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM