JavaScript中使用forEach后对象未修改,为何输出空对象?
问题原因分析
你的代码输出空对象,核心问题出在forEach对异步函数的处理逻辑上:
forEach本身是同步执行的遍历方法,它只会依次触发每个异步回调函数的执行,但不会等待回调里的await操作完成。也就是说,三个async回调刚启动异步请求,forEach就已经执行完毕,直接走到了console.log(testObject)这一步。- 此时所有数据库查询的异步操作还没完成,
testObject还没被赋值,所以控制台输出空对象。等后续异步请求完成后,testObject才会被赋值,但这时候console.log早就执行过了。
解决办法
方法1:使用for...of循环(串行执行)
for...of支持异步等待,会逐个完成异步操作后再继续:
async function fetcher(){ var testObject = {} for (const num of [1,2,3]) { testObject[num] = await db.collection.find({name: num}) } console.log(testObject) } fetcher()
方法2:使用Promise.all+map(并行执行,效率更高)
如果不需要串行执行数据库查询,可以用Promise.all等待所有异步操作完成,再合并结果:
async function fetcher(){ const promiseList = [1,2,3].map(async (num) => { return { [num]: await db.collection.find({name: num}) } }) const results = await Promise.all(promiseList) const testObject = Object.assign({}, ...results) console.log(testObject) } fetcher()
内容的提问来源于stack exchange,提问作者TungTung
相关产品推荐
相关产品推荐

