在for循环中使用async/await未等待异步调用,getNumFruit未执行求助
解决你的async/await和循环执行问题
我帮你找出代码里的两个核心问题,还有几个细节需要修正:
问题1:for循环语法错误导致循环完全未执行
你的for循环结构写反了!正确的for循环格式是for(初始化语句; 循环条件; 增量语句),但你写成了:
for(i=0;i++;i<fruitsToGet.length)
这种写法会让循环直接终止:初始i=0时,先判断i++(返回0,转为布尔值false),循环条件不满足,直接跳过整个循环——这就是getNumFruit完全没被执行的原因。
另外,循环里你用了未定义的index变量,应该用循环变量i来取数组元素。
问题2:async函数调用后未正确处理异步结果
test()是async函数,调用后会返回一个Promise对象,你直接console.log(result)只会打印Promise实例,而不是最终的"done"。而且后续的console.log("end!!!!!")会在test里的异步操作完成前就执行,完全达不到你想要的顺序。
额外问题:sleep函数未定义
你在getNumFruit里用了sleep(1000),但代码里没定义这个函数,得补充一个模拟sleep的异步函数才能正常运行。
修正后的完整代码
const fruitsToGet = ['apple', 'grape', 'pear'] const fruitBasket = { apple: 27, grape: 0, pear: 14 } // 补充sleep函数 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } console.log("start"); async function getNumFruit(fruit) { console.log("inside getNumFruit") return sleep(1000).then(v => fruitBasket[fruit]) } async function test(){ console.log("inside test"); // 修正for循环语法,用let声明i避免全局变量污染 for(let i=0; i < fruitsToGet.length; i++){ console.log("start loop iteration"); const fruit = fruitsToGet[i] const numFruit = await getNumFruit(fruit) console.log(numFruit) } return "done"; } // 正确处理async函数的异步结果 test().then(result => { console.log(result) console.log("end!!!!!") }).catch(err => console.error(err))
运行效果说明
修正后代码会按预期顺序执行:
- 打印
start - 打印
inside test - 依次进入三次循环:每次先打印
start loop iteration,然后调用getNumFruit打印inside getNumFruit,等待1秒后输出对应水果的数量 - 处理完所有水果后,打印
done,最后打印end!!!!!
这样就能解决你遇到的循环内await不等待、异步方法未执行的问题啦!
内容的提问来源于stack exchange,提问作者Lucifer007
相关产品推荐
相关产品推荐

