promise 的 return 可以用作 Promise.all() 执行中下一个函数调用的输入吗?

Can the return of a promise be used as an input for the next function call in a Promise.all() execution?

我在 Whosebug 上看过,但没有看到任何直接的例子来说明我的问题。如果你想看的话,我正在阅读这篇关于记忆的文章 link here

在我看来,您应该能够 运行 它们一起并使用 getSoupRecipe() 的 return 值作为 hireSoupChef()

的输入
async function makeSoupFromType(soupType) {
    
    let [ soupRecipe, soupPan, soupChef ] = await Promise.all([
        
        getSoupRecipe(soupType),
        buySoupPan(),
        hireSoupChef(soupRecipe.requiredSkills)
    ]);
    
    return await makeSoup(soupChef, soupRecipe, soupPan);
}

所以问题是可以同时使用所有三个异步函数 运行 和 once getSoupRecipe returns 我用它是变量名称(即 soupRecipe)作为 hireSoupChef 的输入。

我会 post 所有其他代码在这里供您查看,但我认为这可能会使问题看起来太令人生畏,所以 link 在上面。你不一定要看它才能理解我不认为,因为我认为我已经正确地陈述了问题,但是如果你愿意,你可以。

不是自己,不是。在您的示例中,soupRecipe(和其他两个变量)仅在 Promise.all(…)awaited 后才初始化,因此它不能用于传递给 Promise.all 作为参数。这里没有魔法,Promise.all 不是语法的一部分,但实际上只是返回一个用数组 once.

实现的承诺

但是, to 中概述的方法确实启用了所需的异步操作链接:

async function makeSoupFromType(soupType) {
    const soupRecipePromise = getSoupRecipe(soupType);
    const [soupRecipe, soupPan, soupChef] = await Promise.all([
        soupRecipePromise,
        buySoupPan(),
        soupRecipePromise.then(({requiredSkills}) => hireSoupChef(requiredSkills))
    ]);
    
    return makeSoup(soupChef, soupRecipe, soupPan);
}

或者,使用普通 async/await,您也可以使用 IIFE 来避免 then() 调用:

async function makeSoupFromType(soupType) {
    const [soupPan, [soupRecipe, soupChef]] = await Promise.all([
        buySoupPan(),
        (async () => {
            const soupRecipe = await getSoupRecipe(soupType);
            const soupChef = await hireSoupChef(soupRecipe.requiredSkills);
            return [soupRecipe, soupChef];
        })(),
    ]);
    
    return makeSoup(soupChef, soupRecipe, soupPan);
}