You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:02:03