Обработка ошибок в Promise.all - отклонение обещания + ошибка типа - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть несколько Promise.all функций:

const fn = async () => {
   await Promise.all(first());
   await Promise.all(second());
   await Promise.all(third());
}

first, second и third функции выглядят почти одинаково вместе.

first функция:

const first = async () => {
   const oldUsers = await User.find(...);

   return Array.isArray(oldUsers) ? oldUsers.map(async (user) => {
      await User.updateOne({ _id: user._id }, { ... });

      await transporter.sendMail(sendMail(user));
   }) : [];
};

Моя проблема:

При запуске приложения и вызове функции fn, только сначала Promise.all успешно (пользователь обновлен и письмо отправлено), но second и third даже не вызывается.

В консоли я получил ошибку:

UnhandledPromiseRejectionWarning: TypeError: undefined is not a function

Я борюсь с этим весь день , что мне делать, чтобы все три Promise.all были успешно завершены?Нужна помощь, заранее спасибо.

1 Ответ

2 голосов
/ 09 апреля 2019

Ваша проблема в том, что Promise.all принимает массив обещаний, но ваша функция first() имеет значение async и поэтому возвращает обещание для чего-либо. Это обещание не повторяется, поэтому Promise.all не выполняется. Вы можете исправить это, выполнив

await Promise.all(await first());

но на самом деле вы должны переместить Promise.all в саму функцию first:

async function first() {
  const oldUsers = await User.find(...);

  return Array.isArray(oldUsers)
    ? Promise.all(oldUsers.map(async (user) => {
        await User.updateOne({ _id: user._id }, { ... });
        await transporter.sendMail(sendMail(user));
      }))
    : [];
}

async function fn() {
   await first();
   await second();
   await third();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...