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

通用JS异步并行与串行调用处理函数开发问询

异步并行与串行调用通用函数实现

现有实现方式

串行调用(内联await)

export async function init() {
   const results1 = await callout1();
   const results2 = await callout2();
}

并行调用

async function init() {
   const records = await this.loadRecords();
}

async function loadRecords(){
   const records = getRecords({recordId: this.recordId});
   const picklistOptions = getPicklistOptions();

   return {
      records: await records,
      picklistOptions: await picklistOptions
   }
}

通用函数构思与问题分析

希望实现全局可用的通用函数,只需传入函数数组即可自动处理并行/串行调用,构思的实现如下:

import { asyncParallel, asyncSequential } from 'c/util';

async function init() {
   const records = await asyncParallel([getRecords(), getPicklistOptions()]);
   const records2 = await asyncSequential([getRecords(), getPicklistOptions()]);
}

async function asyncParallel(arrayFunctions) {
   return await Promise.all(arrayFunctions);
}

async function asyncSequential(arrayFunctions) {
   // 疑问:这样会不会以并行方式运行?因为for循环只是将Promise推入数组
   let ret = [];
   for(const func of arrayFunctions){
      ret.push(await func);
   }
   return ret;
}

关键分析

  • 并行函数asyncParallel:这个实现是有效的,Promise.all会等待所有传入的Promise完成,返回结果数组,顺序和传入的Promise数组一致。但要注意:如果传入的是getRecords()这类已执行的函数(直接返回Promise),当前写法没问题;如果要延迟执行函数(避免提前发起请求),应该传入函数本身而非执行结果,此时需修改并行函数为:

    async function asyncParallel(arrayFunctions) {
       return await Promise.all(arrayFunctions.map(fn => fn()));
    }
    

    调用时传入[getRecords, getPicklistOptions]即可。

  • 串行函数asyncSequential:当前写法是正确的串行执行——for...of循环里每次await func都会等待当前Promise完成后才进入下一次循环,不会并行运行。不过确实如你所说,通用串行函数的适用场景有限,只有当后续调用依赖前一次调用结果时才更有价值,比如:

    async function asyncSequentialWithDeps(arrayAsyncFuncs) {
       const results = [];
       let prevResult;
       for (const fn of arrayAsyncFuncs) {
          prevResult = await fn(prevResult);
          results.push(prevResult);
       }
       return results;
    }
    

    这种带依赖的串行函数实用性更强,无依赖的串行直接用await逐个编写和用通用函数差异不大。

总结

  • 通用并行函数确实非常实用,能简化并行异步调用的代码,建议保留并根据是否需要延迟执行调整实现;
  • 无依赖的通用串行函数实用性有限,但若有带依赖的串行场景,可以实现对应的版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:00