如何最优调用多个异步方法?对比await串行与Promise.all方案
异步方法调用的最优方案分析
先明确两种写法的核心差异:
第一种顺序
await的写法:async function waitAll() { await call1(); await call2(); await call3(); }它是串行执行:必须等
call1()完全结束,才会启动call2(),再等call2()结束才启动call3()。总耗时是三个异步操作的时间相加,比如每个操作各花1秒,总耗时就是3秒。第二种
Promise.all的写法:function callPromises() { Promise.all([promise1, promise2, promise3]).then(/* .... */) }它是并行执行:三个异步操作会同时发起,不用等前一个完成才启动下一个。总耗时等于三个操作中耗时最长的那个,比如每个操作各花1秒,总耗时就是1秒——你觉得它更快完全正确。
最优方式
如果这三个异步操作之间没有依赖关系(比如不需要用call1()的结果作为call2()的参数),那**Promise.all就是最优方案**。甚至可以结合async/await写出更易读的版本:
async function callPromisesParallel() { // 同时发起三个异步请求 const results = await Promise.all([call1(), call2(), call3()]); // results[0]是call1的返回值,results[1]是call2的,以此类推 // 后续处理逻辑 }
注意:如果你的promise1/promise2/promise3是预先创建好的Promise实例,那它们在创建时就已经开始执行了,Promise.all只是等待它们全部完成;如果是像call1()这样的函数调用才返回Promise,一定要把函数调用放在Promise.all的数组里,才能保证并行发起。
特殊情况
如果异步操作之间有依赖(比如call2()必须用到call1()的返回结果),那只能用串行await的方式,这时候没得选,只能按顺序执行。
内容的提问来源于stack exchange,提问作者A.Vinuela
相关产品推荐
相关产品推荐

