首页 > 解决方案 > 使用 await new Promise() 时,for 循环后的代码未执行

问题描述

我有一个异步函数,并且有一个循环:

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]

标签: javascriptfor-loopasync-await

解决方案


循环之后的代码不会执行,因为您没有解析或拒绝您 created Promise

您说得对,这if(!(i<a.length))return;会导致问题,因为使用 return 语句,您取消了内部函数的进一步执行setTimeout,但您没有解决您的承诺。所以 await 函数永远等待。

为了简单地解决您的问题,您可以执行以下操作:

if(!(i<a.length)){
    return rs(); // Returns and resolves your created promise
}

推荐阅读