这是在承诺中嵌套异步函数的正确方法吗?

Bad*_*ush 1 javascript

看看其他问题,不清楚在这里做的最好的事情是什么。

我需要从函数 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)

Eri*_*ase 5

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)