簡體   English   中英

使用 await new Promise() 時 for 循環后的代碼不執行

[英]Code after for loop not executing when using await new Promise()

我有一個異步函數,它有一個循環:

let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
    // FURTHER CODE
}

在循環中有我 sthis 代碼:

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;

但我不知道在哪里以及為什么。 這個語句很重要,不要因為訪問a[i]而得到TypeError

循環之后的代碼不會執行,因為您沒有解析或拒絕創建的Promise

你說得對,這個if(!(i<a.length))return; 導致問題,因為使用 return 語句,您取消了setTimeout內函數的進一步執行,但您沒有解決您的承諾。 所以 await 函數會永遠等待。

要簡單地解決您的問題,您可以執行以下操作:

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]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM