Как правильно реализовать mongodb async / await внутри обещания? - PullRequest
0 голосов
/ 30 июня 2018

Я читал, что асинхронность внутри Promise является анти-паттерном для асинхронности / ожидания. Код ниже работает, но мне любопытно, как еще добиться того же результата, не имея async в Promise.

Если я удалю его, линтер скажет, как я не могу использовать await в моем запросе к mongodb. Если я удалю await в запросе mongodb, он не будет ждать результата.

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

    // other logic here...

    resolve({
      employees,
    });
  });

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Как ответил @ CertainPerformance , это идеальный способ извлечения данных из 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;
        }
    }
};

Еще несколько объяснений об асинхронном ожидании и более полезных методах, которые вы можете найти в этих ответах. Как запустить async / await параллельно в Javascript

0 голосов
/ 30 июня 2018

async функции автоматически возвращают Promise s, которые разрешаются с любым выражением, которое в конечном итоге return ed. Просто сделайте getEmployees async функцию:

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

  // other logic here...

  return { employees };
};

(но обязательно наберите catch для потребителя getEmployees на случай, если возникнет ошибка)

...