如何为存在相互依赖的任务集构建async-await代码,替换async.auto?
转换步骤
- 首先将所有回调式的任务改造为返回Promise的函数,这是async/await使用的基础
- 无前置依赖的任务(a、b、c、f)直接同步调用启动,不要加await,让它们并行执行,最大化执行效率
- 有依赖的任务,用
Promise.all等待对应的前置任务完成后再执行,然后同样可以先存Promise实例,供后续依赖它的任务使用 - 最后等待所有任务完成,就能拿到全部执行结果
完整转换后的代码
// 第一步:改造所有任务为返回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
相关产品推荐
相关产品推荐

