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

如何为存在相互依赖的任务集构建async-await代码,替换async.auto?

转换步骤

  1. 首先将所有回调式的任务改造为返回Promise的函数,这是async/await使用的基础
  2. 无前置依赖的任务(a、b、c、f)直接同步调用启动,不要加await,让它们并行执行,最大化执行效率
  3. 有依赖的任务,用Promise.all等待对应的前置任务完成后再执行,然后同样可以先存Promise实例,供后续依赖它的任务使用
  4. 最后等待所有任务完成,就能拿到全部执行结果

完整转换后的代码

// 第一步:改造所有任务为返回Promise的形式
const a = () => new Promise((resolve) => {
  setTimeout(() => {
    const resA = 3;
    resolve(resA);
  }, 1000);
});

const b = () => new Promise((resolve) => {
  setTimeout(() => {
    const resB = 4;
    resolve(resB);
  }, 1000);
});

const c = () => new Promise((resolve) => {
  setTimeout(() => {
    const resC = 5;
    resolve(resC);
  }, 1000);
});

const d = (resA, resB) => new Promise((resolve) => {
  setTimeout(() => {
    const resD = resA + resB;
    resolve(resD);
  }, 1000);
});

const e = (resB, resC) => new Promise((resolve) => {
  setTimeout(() => {
    const resE = resB + resC;
    resolve(resE);
  }, 1000);
});

// 原代码未定义resF,这里赋值为6,可替换为实际业务值
const resF = 6;
const f = () => Promise.resolve(resF);

const g = (resE, resF) => new Promise((resolve) => {
  setTimeout(() => {
    const resG = resE + resF;
    resolve(resG);
  }, 1000);
});

// 第二步:按依赖关系执行任务,保证无依赖任务尽早并行启动
async function runTasks() {
  try {
    // 无依赖任务直接启动,并行执行
    const promiseA = a();
    const promiseB = b();
    const promiseC = c();
    const promiseF = f();

    // 等待a和b完成后执行d
    const [resA, resB] = await Promise.all([promiseA, promiseB]);
    const promiseD = d(resA, resB);

    // 等待b和c完成后执行e
    const [, resC] = await Promise.all([promiseB, promiseC]);
    const promiseE = e(resB, resC);

    // 等待e和f完成后执行g
    const [resE, resFVal] = await Promise.all([promiseE, promiseF]);
    const promiseG = g(resE, resFVal);

    // 等待所有任务完成,收集全部结果
    const [resD, resG] = await Promise.all([promiseD, promiseG]);
    const results = {
      a: resA,
      b: resB,
      c: resC,
      d: resD,
      e: resE,
      f: resFVal,
      g: resG
    };
    console.log('results : ', results);
  } catch (err) {
    console.log('err : ', err);
  }
}

runTasks();

执行效率说明

上述代码的总执行耗时和原async.auto版本一致,都是3秒左右:

  • 第1秒:a、b、c、f并行执行完成
  • 第2秒:d、e并行执行完成
  • 第3秒:g执行完成
    完全满足所有任务尽可能早执行完成的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:30:01