[英]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.