使用async/await实现exec函数:Promise.all加速异步同步任务是否合理?
关于exec()函数实现的分析
现有实现是否合理?
不合理。因为sync()是同步函数,在Promise.all([asyncF(), sync()])里会被立即同步执行——代码会先跑完sync()的所有逻辑,才会去调用asyncF(),完全没做到并行执行。举个实际例子:如果sync()耗时2秒,asyncF()耗时3秒,现有代码总耗时会是2+3=5秒,而非并行情况下的3秒,完全没达到“尽可能快”的要求。
更优实现方式
要让两者真正并行,核心是把同步函数sync()转换成异步任务调度,避免它阻塞asyncF()的启动。结合要求的仅用async/await语法,我们可以用async函数包装sync():
实现代码
async exec() { // 先分别启动两个任务,避免同步阻塞 const asyncTask = asyncF(); // 用async函数包装sync,让它进入异步队列 const syncTask = (async () => sync())(); // 等待两个任务都完成 const [res1, res2] = await Promise.all([asyncTask, syncTask]); // ...后续业务逻辑 }
也可以把包装逻辑抽出来,让代码更清晰:
// 用async函数包装同步函数,转换为异步任务 const wrapSyncToAsync = async () => sync(); async exec() { const [res1, res2] = await Promise.all([asyncF(), wrapSyncToAsync()]); // ...后续业务逻辑 }
原理说明
async函数内部的同步代码会被放入微任务队列执行,所以wrapSyncToAsync()调用后不会立即阻塞主线程,而是和asyncF()的异步请求同时被调度,总耗时会是两个任务中耗时较长的那个,真正实现了并行执行的效果,满足“尽可能快”的要求。
内容的提问来源于stack exchange,提问作者yoty66
相关产品推荐
相关产品推荐

