通用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
相关产品推荐
相关产品推荐

