NodeJS async/await场景下forEach循环未完成提前返回如何解决?
问题原因
1. 异步forEach不生效
Array.forEach 本身不支持等待异步回调执行完成,你给forEach外层加的await完全无效:forEach执行时只会把所有异步回调抛到事件循环里,直接返回undefined,await undefined会立即完成,不等里面的分支查询、数据赋值逻辑跑完,函数就会提前返回结果。
2. 异步调用漏加await
getUserBranch 函数内调用异步方法getUserProps时没有加await,导致返回的是Promise对象而非实际的分支数据,就算循环等完也拿不到正确的位置信息。
修复方案
替换forEach为Promise.all+map
把getAllUserData里的循环逻辑改成如下写法:
try { // 用map把每个用户的异步操作转为Promise,用Promise.all等待全部执行完成 await Promise.all(users.map(async user => { const branch = await Users.getUserBranch(user); const province = getKey(branch); user.province = province; // 清理关联查询冗余字段 user.numMessages = user["tblSMSSent.numMessages"]; delete user["tblSMSSent.numMessages"]; })) const obj = { 'users': users }; console.log("DONE: ", obj) return obj; }
补全getUserBranch的await
const getUserBranch = async (user) => { // 异步方法必须加await才能拿到返回值 let branch = await getUserProps(user.collector ? user.collector : user, 'branch'); if (!branch) branch = 0; return branch; }
修改完成后,getAllUserData会等待所有用户的位置数据全部加载、赋值完成后才会返回结果。
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

