johnymkp
@johnymkp

Почему не пойманная в Promise.all ошибка не попадает в catch?

Когда у нас один промис и в нем возникает не пойманная ошибка, то получается как бы автоматический reject с передачей в него этой ошибки, например:
new Promise(() => {
  throw new Error("Ошибка в промисе!")
})
  .then(result => console.log(result))
  .catch(err => console.log(err.message));

Ошибка попадает в блок catch и мы видим в консоли сообщение.

Но вот если такая ситуация возникнет в промисе, переданном в Promise.all, то в catch мы не попадаем:
let prom = Promise.all([
  new Promise(resolve => setTimeout(() => resolve("Первый")), 3000),
  new Promise((resolve, reject) => setTimeout(() => { 
    throw new Error("Ошибка во втором промисе"); 
    // reject(new Error("Ошибка во втором промисе"));  // Если вместо предыдущей строки - эта, то в catch попадем
  }, 2000)),
  new Promise(resolve => setTimeout(() => resolve("Третий")), 1000)
]);

prom
  .then(results => results.forEach(m => console.log(m)))
  .catch(err => console.log(err.message));

В catch мы тут попадем только если вызовем reject во втором промисе.

Нормальное ли это поведение? И если да, то можно ли как-то в таком случае сделать общий обработчик для непредвиденных ошибок, которые могут возникнуть в одном из промисов? Чтобы скрипт не падал полностью
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
чтобы промис зареджектился из-за throw, в нем случившемся, оный throw должен произойти синхронно. А у тебя - по таймауту.
Для асинхронного реджекта надо функцию reject вызвать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы