`foreach` 无法等待内部 `async` 函数完成,导致后续逻辑提前执行;应改用 `for…of` 循环配合 `await`,确保异步操作串行完成后再继续。
在 Node.js 或现代 JavaScript 中处理异步循环时,一个常见误区是误以为 Array.prototype.forEach() 能与 async/await 协同工作。实际上,forEach 会忽略返回的 Promise,直接同步遍历所有元素,不等待每个异步回调结束——这正是你遇到问题的根本原因:messageGetter(link) 被并发触发但未被等待,console.log(“here”) 和 broadcast() 在所有消息获取完成前就已执行,造成 imageLinks 为空。
✅ 正确做法是使用 for…of(或传统 for 循环),它天然支持 await,可实现串行可控的异步执行:
async function fetchImages(app) {
for (const link of app.links) { // 注意:原代码中为 app.link,实际应为 app.links(复数)以符合语义
if (link.type === 0) {
await messageGetter(link);
}
}
console.log("here"); // 此时所有 messageGetter 已完成
broadcast({ type: "imageLinks", data: imageLinks });
imageLinks.length = 0; // 更简洁的清空方式,替代 splice(0, imageLinks.length)
}
⚠️ 补充注意事项: