如何让async函数仅在调用Promise.all时执行,而非定义时立即触发
问题原因
Promise 本身是立即执行的,实例被创建的瞬间就会启动内部异步逻辑,和后续是否调用 Promise.all 没有关联。你在第一个循环里直接调用了 executeMethod(bucketObject),相当于直接创建了 Promise 实例,自然会提前执行。
解决方案
不要直接存储 Promise 实例,改为存储「返回 Promise 的包装函数」,等到逐批处理时再调用函数生成 Promise 触发执行。
修改后的完整代码如下:
const MAX_NUMBER_OF_CONCURRENT_PROMISES = 100; // 数组类型改为存返回Promise的函数 const taskArray: (() => Promise<void>)[][] = []; let taskArrayIndex = 0; let innerTaskArrayIndex = 0; const objectsList = [......]; // 初始化第一层数组 taskArray[taskArrayIndex] = []; for (const bucketObject of objectsList) { if (innerTaskArrayIndex === MAX_NUMBER_OF_CONCURRENT_PROMISES) { innerTaskArrayIndex = 0; taskArrayIndex++; taskArray[taskArrayIndex] = []; } // 存包装函数,不直接执行executeMethod taskArray[taskArrayIndex][innerTaskArrayIndex] = () => executeMethod(bucketObject); innerTaskArrayIndex++; } // 逐批执行,注意判断条件改为<=避免漏掉最后一批 for (let i=0; i <= taskArrayIndex; i++) { // 调用所有包装函数生成Promise实例,再批量等待 await Promise.all(taskArray[i].map(taskFn => taskFn())); }
额外注意
你原有代码的第二个循环判断条件为 i < promiseArrayIndex,会漏掉索引为 promiseArrayIndex 的最后一批任务,修改时需要调整为 <= 才能保证所有任务都被执行。
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

