如何等待异步forEach执行完毕以获取更新后的assetsArray?
问题原因
你遇到的问题是因为Image.create是异步操作,forEach不会等待每个异步任务完成就继续执行后续代码,所以最后一行的console.log(assetsArray)在所有创建操作还没结束时就运行了,此时数组还没被填充,自然输出为空。
解决方案
有两种常用的解决方式,根据你的需求选择:
方式一:使用for...of + async/await(串行执行)
这种方式会逐个创建记录,适合需要保证顺序的场景:
let assetsArray = []; if (assets) { // 需包裹在async函数中执行,或当前函数本身是async类型 const parsedAssets = JSON.parse(assets); for (const asset of parsedAssets) { const record = await Image.create({ organization: organizationID, imageName: asset.imageName, imageDescription: asset.imageDescription ?? null, imagePath: asset.imagePath }); console.log(record); assetsArray.push(record._id); } } console.log(assetsArray); // 此时数组已完成填充
方式二:使用Promise.all(并行执行)
这种方式会同时发起所有创建请求,执行效率更高,适合不需要严格顺序的场景:
let assetsArray = []; if (assets) { const parsedAssets = JSON.parse(assets); // 收集所有创建操作的Promise,直接在then中返回_id const createPromises = parsedAssets.map(asset => Image.create({ organization: organizationID, imageName: asset.imageName, imageDescription: asset.imageDescription ?? null, imagePath: asset.imagePath }).then(record => record._id) ); // 等待所有Promise完成,一次性获取所有_id assetsArray = await Promise.all(createPromises); } console.log(assetsArray); // 此时数组已完成填充
注意:以上两种方案都需要在async函数内部执行,否则无法使用await语法。
内容的提问来源于stack exchange,提问作者Jacky.S
相关产品推荐
相关产品推荐

