在Promise.all中同步与异步代码并行执行是否具备性能优势?
问题解答
1. 这种写法能否在异步请求等待响应的同时运行同步代码?
可以,但要结合JavaScript单线程特性理解:
执行Promise.all([getDataFromEndpoint(anotherKey), mergeResults(...)])时,会先立即发起getDataFromEndpoint('d')的异步请求(请求会进入浏览器/Node.js的异步IO队列等待响应),紧接着主线程就会执行同步的mergeResults合并操作。
也就是说,异步请求在后台等待响应的过程中,主线程并没有闲置,而是在处理同步的合并计算,两者的时间是重叠的,而非串行等待。
2. 是否比不放入Promise.all更具性能优势?
是的,有明显的性能优势:
- 如果不放入
Promise.all,不管是先等异步请求完成再合并,还是先合并再发起请求,总耗时都是异步请求耗时 + 合并操作耗时。 - 放入
Promise.all后,总耗时是异步请求耗时和合并操作耗时中的较大值(比如请求耗时200ms、合并耗时150ms,总耗时就是200ms;如果合并耗时300ms、请求耗时200ms,总耗时就是300ms)。
这种写法确实能有效减少整体执行时间,你的用法是合理的。
原代码回顾
第一步获取数据:
const keys = ['a', 'b', 'c']; const getDataFromEndpoint = async (key) => { return await ... ; }; const [result1, result2, result3] = await Promise.all(keys.map(key => getDataFromEndpoint(key)));
第二步并行处理异步请求与同步合并:
const mergeResults = (arrayOfResults) => { return arrayOfResults.reduce( ... ); }; const anotherKey = 'd'; const [result4, mergedResults] = await Promise.all([ getDataFromEndpoint(anotherKey), mergeResults([result1, result2, result3]), ]);
内容的提问来源于stack exchange,提问作者GorgonFreeman
相关产品推荐
相关产品推荐

