无需使用立即执行函数并行调用JavaScript异步方法的方案
优化并行Web服务调用的可读性方案
你的核心需求是保持并行调用效率的同时提升代码可读性,下面提供两种更优的实现方式:
方式一:避免外部变量直接修改(推荐)
这种方式通过临时对象收集异步结果,最后统一更新变量,逻辑更清晰,减少异步操作的副作用:
const promises = []; const resultMap = {}; // 仅当targetLocation未定义时,发起异步请求并存储结果 if (!targetLocation) { promises.push( getStorageLocation(storageID).then(res => { resultMap.targetLocation = res; }) ); } // 同理处理carrierToMove if (!carrierToMove) { promises.push( getCarrierToMove(/* 传入所需参数 */).then(res => { resultMap.carrierToMove = res; }) ); } // 等待所有并行请求完成 await Promise.all(promises); // 更新外部变量(如果有结果则覆盖,否则保留原变量值) targetLocation = resultMap.targetLocation ?? targetLocation; carrierToMove = resultMap.carrierToMove ?? carrierToMove; pushCarrierIntoStorage(carrierToMove, targetLocation);
方式二:用异步箭头函数简化IIFE
如果不想改变变量更新的逻辑,仅优化可读性,可以用更简洁的异步箭头函数替代传统IIFE:
const awaitors = []; if (!targetLocation) { awaitors.push( (async () => { targetLocation = await getStorageLocation(storageID); })() ); } if (!carrierToMove) { awaitors.push( (async () => { carrierToMove = await getCarrierToMove(/* 传入所需参数 */); })() ); } await Promise.all(awaitors); pushCarrierIntoStorage(carrierToMove, targetLocation);
优化说明
- 方式一通过
then回调集中管理结果,避免异步操作直接修改外部变量,代码逻辑更易追踪,维护性更强; - 方式二保留了原有的变量更新逻辑,但用更紧凑的异步箭头函数替代冗长的传统IIFE,减少了语法冗余,可读性明显提升;
- 两种方式都完全保留了并行执行的能力,所有符合条件的Web服务调用会同时发起,不会牺牲执行效率。
内容的提问来源于stack exchange,提问作者André Reichelt
相关产品推荐
相关产品推荐

