[英]How to wait for a loop with promises to complete to execute a method?
我想執行一個帶有承諾的循環,但我只想在循環完成后才執行一個方法。
這是我想做的一個類似的例子
const array = ['a', 'b', 'c'];
console.log('start');
array.forEach((i) => {
setTimeout(()=> console.log(i), 3000);
});
console.log('end');
這是我得到的結果。
start
end
a
b
c
一旦你知道怎么做,就可以很容易地使用Promise.all
之類的東西。
關鍵是創建一個 Promises 數組,然后在其上調用Promise.all
。
但在我展示之前,我們需要做一些調整:
首先讓我們包裝setTimeout以返回 promise:
function delay(amount) {
return new Promise((resolve) => {
setTimeout(resolve, amount);
});
}
然后更改代碼以將所有創建的承諾推送到一個數組中:
const array = ['a', 'b', 'c'];
let promises = [];
async function doSomething(i) {
console.log(i);
await delay(3000);
}
console.log('start');
array.forEach((i) => {
const promise = doSomething(i);
promises.push(promise);
});
這里的doSomething
正在做異步工作。
最后,我們等待Promise.all
解決所有 Promise:
await Promise.all(promises);
console.log('end');
給出:
start
a
b
c
end
function delay(amount) { return new Promise((resolve) => { setTimeout(resolve, amount); }); } const array = ['a', 'b', 'c']; let promises = []; async function doSomething(i) { console.log(i); await delay(3000); } console.log('start'); array.forEach((i) => { const promise = doSomething(i); promises.push(promise); }); Promise.all(promises).then(() => { console.log('end'); });
一種選擇是執行以下操作:
const array = ['a', 'b', 'c'];
console.log('start');
const promises = [];
array.forEach((i) => {
promises.push(new Promise(resolve => setTimeout(() => {
console.log(i)
resolve()
}, 3000)))
})
Promise.all(promises).then(() => {
console.log('end');
})
setTimeout
是異步的,但不像promise那樣可用。如果您的直接問題是在所有超時結束時執行您的代碼,那么應該按如下方式完成:
const array = ['a', 'b', 'c'];
let numberOfTimeoutsToBeExecuted = array.length;
// keep track of the number of timeouts that have finished execution
let numberOfTimeoutsExecuted = 0;
console.log('start');
array.forEach((i) => {
setTimeout(() => {
console.log(i),
numberOfTimeoutsExecuted += 1;
// execute your code when the last timeout has finished execution
if (numberOfTimeoutsToBeExecuted === numberOfTimeoutsExecuted) {
console.log('end');
}
}, 3000);
});
但是,如果你想等待多個promise完成執行,下面是最好的方法:
const array = ['a', 'b', 'c'];
const promises = [];
console.log('start');
array.forEach((i) => {
// add all promises that will be executed into array
promises.push(new Promise((resolve, reject) => {
setTimeout(()=> {
console.log(i);
resolve();
}, 3000);
}));
});
// execute all promises here
Promise.all(promises).then(() => console.log('end'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.