javascript - 这是在 promise 中嵌套异步函数的正确方法吗?

标签 javascript

查看其他问题,并不清楚这里最好的做法是什么。

我需要从函数 A 调用函数 B。但是函数 B 进行了多次异步调用,我更愿意使用异步/等待而不是链接 promise 。问题变成了,我需要告诉函数 A 等待函数 B 中的所有等待完成。

这是我所做的工作,我想知道它是否是反模式。

为此,函数 A(异步)调用函数 B,函数 B 是一个包含异步函数 C 的 promise 。

    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();

       });
    }

最佳答案

Promises 和 await/async 的混合在这种情况下不是必需的。并且不需要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;
}

此外,如果您可以并行执行两个数据库调用,您将需要使用 Promise.all() .

const [var1, var2] = await Promise.all([
    make_databaseCall(), 
    make_different_DatabaseCall()]);

关于javascript - 这是在 promise 中嵌套异步函数的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59411544/

相关文章:

javascript - 在没有 JavaScript 的情况下突出显示 CSS 中的事件面板

javascript - 使用 JavaScript 为 anchor 标记设置属性下载

javascript - 如何使用 .load() 加载 URL

javascript - VueX:如何使用嵌套对象构建我的商店

javascript - 如何将额外的参数传递给 JS Array.forEach()

php - 选择多个单选按钮(通过 jquery、javascript?)

javascript - 无法在 Node 中加载/需要任何 css 文件

javascript - 设置 y 轴显示格式以按 0.2 的增量显示值

javascript - 如何在 JS 中找到数组中的最小值?

javascript - HTML5 Canvas : Replace Cursor with Crossing Lines