看看其他问题,不清楚在这里做的最好的事情是什么。
我需要从函数 A 调用函数 B。但是函数 B 进行了几次异步调用,我更喜欢使用 async/await 而不是链接承诺。问题变成了,我需要告诉函数 A 等待函数 B 中的所有等待完成。
这是我所做的,确实有效,我想知道这是否是一种反模式。
为了实现这一点,函数 A(异步)调用函数 B,这是一个包含异步函数 C 的承诺。
const functionA = async () => {
await functionB().catch(err => console.error(err));
console.log(' ALL DONE ');
}
const functionB = () => {
return new Promise( (resolve,reject) => {
const functionC = async () => {
const var1 = await make_databaseCall();
const var2 = await make_different_DatabaseCall();
if(!var2) throw Error('var2 is invalid!');
const what_I_need = var1 + var2;
return resolve();
}
//Calling Function C and returning what FuncC returns (resolve()) to Function B
return functionC();
});
}
Run Code Online (Sandbox Code Playgroud)
Promises在这种情况下,不需要混合使用和等待/异步。并且functionC()不需要嵌套。我认为您可以将其减少为:
const functionA = async () => {
try {
await functionB();
} catch {...}
}
const functionB = async () => {
const var1 = await make_databaseCall();
const var2 = await make_different_DatabaseCall();
if(!var2) throw Error('var2 is invalid!');
return var1 + var2;
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您可以并行执行两个 db 调用,您将需要使用Promise.all().
const [var1, var2] = await Promise.all([
make_databaseCall(),
make_different_DatabaseCall()]);
Run Code Online (Sandbox Code Playgroud)