我想用 Promise 執行一個回圈,但我只想在回圈完成后執行一個方法。
這是我想做的類似示例
const array = ['a', 'b', 'c'];
console.log('start');
array.forEach((i) => {
setTimeout(()=> console.log(i), 3000);
});
console.log('end');
這是我得到的結果。
start
end
a
b
c
uj5u.com熱心網友回復:
一種選擇是執行以下操作:
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');
})
uj5u.com熱心網友回復:
Promise.all一旦你知道如何,它很容易做到。
關鍵是創建一個 Promises 陣列,然后呼叫Promise.all它。
但在我展示之前,我們需要做一些調整:
首先讓我們包裝setTimeout以回傳一個承諾:
function delay(amount) {
return new Promise((resolve) => {
setTimeout(resolve, amount);
});
}
然后更改代碼以將所有創建的 Promise 推送到陣列中:
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 被解決Promise.all:
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');
});
uj5u.com熱心網友回復:
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'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452951.html
標籤:javascript 打字稿 异步等待
