如何在Promise中正确实现mongodb async / await?

时间:2018-06-30 11:33:51

标签: javascript mongodb promise async-await

我已经读到Promise中有一个异步是异步/等待的反模式。下面的代码有效,但是我很好奇如果没有async中的Promise,如何才能达到相同的结果。

如果我将其删除,则linter会告诉我如何无法在mongodb查询中使用await。如果我在mongodb查询中删除了await,那么它将不会等待结果。

export const getEmployees = (companyId) => {
  return new Promise(async (resolve, reject) => {
    const employees = await Employees.find(
      { companyId },
    );

    // other logic here...

    resolve({
      employees,
    });
  });

谢谢。

2 个答案:

答案 0 :(得分:4)

async函数已经自动返回了Promise,这些表达式最终会用return表达式来解析。只需将getEmployees设为async函数:

export const getEmployees = async (companyId) => {
  const employees = await Employees.find(
    { companyId },
  );

  // other logic here...

  return { employees };
};

(但请确保catch的使用者使用getEmployees,以防出现错误)

答案 1 :(得分:2)

正如@CertainPerformance回答的那样,这是使用async / await从mongoDB检索数据的完美方法,我想添加一些有关如何在这种情况下处理错误的更多信息,以确保系统的正确性和更好的错误处理以将有关其请求的更好状态返回给客户。

我会这样说,您通常想捕获async / await调用中的所有异常。

try {
    const employees = await Employees.find({
        companyId
    });
    // You can add more logic here before return the data.
    return {
        employees
    };
} catch (error) {
    console.error(error);
}

现在让我们检查一下如何处理可能发生的错误。

  1. 处理错误范围内的错误。
  2. 为catch块中的变量分配默认值。
  3. 检查错误实例并采取相应措施。

在这些情况下,这是最常见的错误处理方式,我认为这是最优雅的方式。 处理错误范围内的错误:

export const getEmployees = async (companyId) => {
    try {
        const employees = await Employees.find({
            companyId
        });
        // You can add more logic here before return the data.
        return {
            employees
        };
    } catch (error) {
        console.error(error);
    }
};

为catch块中的变量分配默认值:

export const getEmployees = async (companyId) => {
    let employees;

    try {
        employees = await Employees.find({
            companyId
        });
        // You can add more logic here before return the data.
        employees = employees;
    } catch (error) {
        console.error(error);
    }

    if (employees) { // We received the data successfully.
        console.log(employees)
        // Business logic goes here.
    }

    return employees;
};

检查错误实例并采取相应措施:

export const getEmployees = async (companyId) => {
    try {
        const employees = await Employees.find({
            companyId
        });
        // You can add more logic here before return the data.
        return {
            employees
        };
    } catch (error) {
        if (error instanceof ConnectionError) {
            console.error(error);
        } else {
            throw error;
        }
    }
};

有关异步等待的更多说明以及可以在这些答案中找到的更有用的方法。 How run async / await in parallel in Javascript