尝试遍历for
循环并执行某些操作,但是等待该for循环的每次迭代完成,for循环将不知道它在实际应用程序中有多少个项。
测试
async function getList(){
return new Promise( (resolve, reject) => {
let out = [];
for (let n=0; n <= 4; n++){
// new Promise( (resolve, reject) => {});
let time = (n+1) * 250;
new Promise(resolve => setTimeout(()=>{
log(n);
out.push(n);
resolve();
}, time));
}
// How do I get this resolve to run only once all the for looped promises are complete?
resolve(out);
});
}
function test(){
let numbers = false;
log("start");
log(numbers); // logs false (correct);
getList().then((v)=>{
log("v = " + v); // this should be an array of ints 0 to 4
log("completed");
})
}
console.clear();
test();
输出:
我需要0到4来阻止该过程,然后完成记录。
答案 0 :(得分:1)
在第一个示例中,您无需将getList
标记为async
(无需在顶层使用await
)。问题的症结在于setTimeout
是非阻塞操作,因此您的Promise在数组有机会填充之前就已解决。
在第二个示例中,您使用的是await
,但是在不可等待的项目上(numbers
只是一个数组),因此存在与上述相同的问题(Promise将在数组之前解决)已填充)。
如果在您的“真实世界”应用程序中有一个示例,说明需要等待固定的时间,并且需要按顺序进行,那么可以创建一个等待的setTimeout
例如
const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout));
async function getList() {
const numbers = [1,2,3,4,5,6,7,8,9,10];
const out = [];
for (const n in numbers) {
await sleep(50);
out.push(n);
}
return out;
}