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(…)
被 await
ed 后才初始化,因此它不能用于传递给 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);
}
我在 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(…)
被 await
ed 后才初始化,因此它不能用于传递给 Promise.all
作为参数。这里没有魔法,Promise.all
不是语法的一部分,但实际上只是返回一个用数组 once.
但是,
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);
}