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

JS处理多个异步任务的优雅方法 如何正确等待多个async函数结果

多个异步函数等待的正确实现方案

你当前的嵌套then写法存在几个明显问题:

  • 两个异步请求是串行执行的,call2需要等call1完全返回后才会发起,会浪费不必要的等待时间
  • 嵌套层级过深后会形成回调地狱,代码可读性和可维护性极差
  • 依赖全局变量存储异步结果,容易出现变量污染、意外修改的问题

场景1:两个请求无依赖,可并行执行(推荐)

如果call1和call2的执行没有先后依赖关系,优先用Promise.all实现并行请求,最大化请求效率:
首先建议先修改两个异步函数,直接返回请求结果,避免依赖全局变量:

async function call1() {
    return await $.ajax({url: `api/call1`});
};

async function call2() {
    return await $.ajax({url: `api/call2`});
};

用async/await语法实现(最简洁)

let somevar = async function () {
    // 同时发起两个请求,等所有请求返回后再往下执行
    const [data1, data2] = await Promise.all([call1(), call2()]);
    console.log("call1", data1, "call2", data2);
    // 可在此处处理两个请求的返回结果
};

用then链式写法实现

let somevar = function () {
    Promise.all([call1(), call2()])
        .then(([data1, data2]) => {
            console.log("call1", data1, "call2", data2);
        })
        // 建议添加异常捕获,避免请求报错抛出未处理异常
        .catch(err => {
            console.error('请求执行出错:', err);
        });
};

场景2:两个请求有依赖,必须串行执行

如果call2的执行依赖call1的返回结果,必须等call1执行完才能发起call2,可以用串行await写法,完全避免嵌套:

let somevar = async function () {
    try {
        const data1 = await call1();
        // 可在此处拿data1的结果处理call2的请求参数
        const data2 = await call2();
        console.log("call1", data1, "call2", data2);
    } catch (err) {
        console.error('请求执行出错:', err);
    }
};

补充说明

  • Promise.all的特性是所有输入的Promise全部成功才会返回成功结果,只要有一个请求失败就会直接进入异常分支。如果你需要即使部分请求失败,也要拿到其他请求的返回结果,可以替换为Promise.allSettled
  • 所有异步操作建议都添加异常捕获逻辑,避免未处理的Promise异常导致程序运行问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:21:02