Promise.all()中能否用一个Promise的返回值作为另一函数的输入?
关于Promise.all与异步函数依赖的疑问解答
嘿,我来帮你理清楚这个问题哈~
首先直接给结论:你写的这段代码既不能让三个异步函数同时执行,还会直接报错。
为啥呢?因为Promise.all的特性是——把你传入的所有Promise立即启动执行。你现在把hireSoupChef(soupRecipe.requiredSkills)放进了Promise.all的数组里,这时候代码执行到这里,getSoupRecipe还没完成,soupRecipe根本还没被赋值,直接去读soupRecipe.requiredSkills会立刻抛出ReferenceError,说soupRecipe未定义。
而且退一步说,就算不报错,hireSoupChef需要的是getSoupRecipe的返回值,这俩函数本身就有依赖关系,根本没法同时启动。
那正确的写法应该是怎样的呢?我们可以拆分异步步骤,先等依赖的结果出来,再并行执行不互相依赖的任务:
async function makeSoupFromType(soupType) { // 第一步:先获取汤的食谱,因为雇厨师需要这个结果 const soupRecipe = await getSoupRecipe(soupType); // 第二步:现在食谱有了,同时启动买锅和雇厨师的异步任务 const [soupPan, soupChef] = await Promise.all([ buySoupPan(), hireSoupChef(soupRecipe.requiredSkills) ]); // 第三步:用拿到的所有结果做汤 return await makeSoup(soupChef, soupRecipe, soupPan); }
这样调整后,getSoupRecipe先执行,等它返回食谱后,buySoupPan和hireSoupChef会同时开始执行,既解决了依赖问题,又最大化利用了异步的并行优势,效率最高。
内容的提问来源于stack exchange,提问作者ArrSky76
相关产品推荐
相关产品推荐

