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

如何在forEach循环中等待多个异步对象[key]=value赋值完成?

问题分析

你的代码核心问题在于**forEach不支持异步等待**:forEach仅会遍历执行回调函数,但不会返回Promise实例,因此await numbers.forEach(...)和await letters.forEach(...)根本不会等待内部的异步操作完成,会直接执行后续的打印代码,导致输出时所有异步赋值还未完成。

修复方案

将forEach替换为map+Promise.all组合:map会返回每个异步函数的Promise实例,Promise.all可以等待所有Promise执行完成后再继续后续逻辑。

修改后的代码

const dict = {};

async function placeholder(letter, number) {
    await new Promise(r => setTimeout(r, 2000));
    return 'test';
}

async function secondMethod(letter, number) {
    try {
        dict[letter][number] = await placeholder(letter, number);
    } catch (err) {
        console.error(err);
    }
}

async function firstMethod(letter) {
    dict[letter] = {};
    const numbers = ['1', '2', '3', '4'];
    // 用map生成Promise数组,通过Promise.all等待全部异步操作完成
    await Promise.all(numbers.map(number => secondMethod(letter, number)));
}

async function main() {
    const letters = ['a', 'b', 'c', 'd'];
    // 同样用map+Promise.all等待所有firstMethod执行完成
    await Promise.all(letters.map(letter => firstMethod(letter)));
    console.log(dict);
}

main();

更优雅的写法(避免全局变量)

推荐摒弃全局字典的写法,让每个异步函数返回对应数据,最后组装结果,代码逻辑更可控:

async function placeholder(letter, number) {
    await new Promise(r => setTimeout(r, 2000));
    return 'test';
}

async function getNumberEntries() {
    const numbers = ['1', '2', '3', '4'];
    // 生成数字键值对数组,再转换为对象
    const entries = await Promise.all(
        numbers.map(async number => [number, await placeholder('', number)])
    );
    return Object.fromEntries(entries);
}

async function main() {
    const letters = ['a', 'b', 'c', 'd'];
    // 生成字母键值对数组,转换为最终字典
    const entries = await Promise.all(
        letters.map(async letter => [letter, await getNumberEntries()])
    );
    const dict = Object.fromEntries(entries);
    console.log(dict);
}

main();
运行结果

两种写法都会在等待约2秒后输出你期望的结果:

{
  a: { '1': 'test', '2': 'test', '3': 'test', '4': 'test' },
  b: { '1': 'test', '2': 'test', '3': 'test', '4': 'test' },
  c: { '1': 'test', '2': 'test', '3': 'test', '4': 'test' },
  d: { '1': 'test', '2': 'test', '3': 'test', '4': 'test' }
}

内容的提问来源于stack exchange,提问作者Sam Germain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:30:47