如何等待所有Promise执行完毕后再运行后续收尾代码
问题根因分析
- 你实现的
functionOne、functionTwo返回的Promise没有主动触发resolve,导致Promise一直处于pending状态,后续的then回调永远不会被执行,这就是你看到收尾日志要么提前打印要么完全不输出的核心原因。 - 最初的
runningFunctionsasync函数内部没有等待两个异步任务执行完成,也没有返回对应的Promise集合,所以调用runningFunctions().then()的时候,回调会立即触发,不会等任务结束。
正确实现代码
const logger = console; const functionOne = function () { logger.info("Starting functionOne"); return new Promise(resolve => { setTimeout(function () { logger.info("Finished functionOne after 20 sec."); resolve(); // 标记Promise任务完成 }, 20000); }); }; const functionTwo = function () { logger.info("Starting functionTwo"); return new Promise(resolve => { setTimeout(function () { logger.info("Finished functionTwo after 10 sec."); resolve(); // 标记Promise任务完成 }, 10000); }); }; const runningFunctions = async function () { logger.info('Start jobs'); // 并行执行两个任务,等待全部完成后再结束当前函数 await Promise.all([functionOne(), functionTwo()]); } // 所有任务完成后执行收尾逻辑 runningFunctions().then( () => { logger.info(`All done after 20 sec.`) } ).catch( err => { logger.error(err) } );
实现说明
- 两个异步函数内部新增
resolve()调用,任务执行完毕后主动通知Promise状态变更为已完成 runningFunctions内部通过Promise.all实现两个任务并行执行,并用await阻塞等待所有任务执行完成- 收尾逻辑放在
runningFunctions的then回调中,保证所有异步任务全部执行结束后才会触发
内容的提问来源于stack exchange,提问作者Wernfried Domscheit
相关产品推荐
相关产品推荐

