我有一个异步函数,我有一个循环:
let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
// FURTHER CODE
}
在循环中,我有以下代码:
let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
await new Promise((rs,rj)=>{
setTimeout(()=>{
for(let x = 0; x < step; x++){
let a = combinedData; // Array of 2522 elements
let i = z*step + x;
if(!(i < a.length))
return;
// LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT I THINK
}
rs();
});
});
console.log(`Showed ${z}`);
}
console.log('end');
当我运行它时,结果是:
Showed 1
Showed 2
...
Showed 24
一切都是正确的,除了不显示"结束"。我检查了,没有错误
//LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT
部分,所以不用担心。
我认为,这个错误在于某个地方
if(!(i<a.length))return;
但我不知道在哪里以及为什么。这句话很重要,不能得到 TypeError
是因为访问a[i]
循环
后的代码不会执行,因为您不解析或拒绝创建的Promise
。
你的观点是对的,这个if(!(i<a.length))return;
会导致问题,因为使用 return-语句,你取消了 setTimeout
中函数的进一步执行,但你没有解决你的承诺。因此,等待函数会永远等待。
要简单地解决您的问题,您可以执行以下操作:
if(!(i<a.length)){
return rs(); // Returns and resolves your created promise
}
这可以让您了解如何正确编码循环:
async function delayedFunc(i, index) {
await new Promise(resolve => setTimeout(resolve, 100));
console.log(i, index);
}
async function main(array) {
for (const [index, item] of array.entries()) {
await delayedFunc(item, index);
}
console.log('Done!');
}
main([1, 2, 3, 4, 5]);