javascript - 使用 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]
解决方案
循环之后的代码不会执行,因为您没有解析或拒绝您 created Promise
。
您说得对,这if(!(i<a.length))return;
会导致问题,因为使用 return 语句,您取消了内部函数的进一步执行setTimeout
,但您没有解决您的承诺。所以 await 函数永远等待。
为了简单地解决您的问题,您可以执行以下操作:
if(!(i<a.length)){
return rs(); // Returns and resolves your created promise
}
推荐阅读
- sql - 在单个 JSONB 查询中限制和包含
- plasticscm - 如何增加 Plastic Merge Tool 的可用资源?
- python - NOT NULL 约束失败:snippets_choice.post_id
- react-native - 尝试在snack.expo.io 中使用tipsi-twitter?
- batch-file - 尝试批量获取没有临时文件的变量
- c# - 使用从数组中选择信息
- c++ - 在 C++ 中设计混合结构?
- java - 如何找到总和等于 k 且时间复杂度最小的最长子集(幂集)的长度?
- javascript - 谷歌图表 - 如何居中注释
- python - 根据时间范围制作字符串