NodeJS中await搭配forEach使用时异步指令未正确等待返回结果为空问题
问题原因
Array.prototype.forEach 本身不支持等待异步回调执行完成,你传入的async回调会返回Promise实例,但forEach不会收集这些Promise,也不会等待它们状态变更,遍历触发完所有回调就会直接结束,且forEach的返回值为undefined。你写的await stores.forEach(...)本质上是await了一个非Promise的undefined值,会直接跳过等待,执行后续的return orders逻辑,此时所有getOrders的异步请求还未返回结果,自然得到空数组。
修复方案
你可以根据业务需要选择以下两种方案:
- 并行请求(性能更高,推荐无并发限制时使用):用
Promise.all配合map批量等待所有异步请求完成
// map会将每个store映射为getOrders返回的Promise实例 orders = await Promise.all(stores.map(store => getOrders(store, token, tokenType))) return orders
Promise.all会等待所有传入的Promise都resolve之后,将所有返回结果按原顺序组装为数组返回,不需要手动push到orders数组中。
- 串行请求(适合需要控制并发、按顺序请求的场景):用
for of循环替代forEach
for (const store of stores) { const arr = await getOrders(store, token, tokenType) orders.push(arr) } return orders
for of循环原生支持在async函数内通过await逐个等待异步操作执行完成,所有请求都执行完毕后才会走到return逻辑。
内容的提问来源于stack exchange,提问作者user14623448
相关产品推荐
相关产品推荐

