Когда у нас один промис и в нем возникает не пойманная ошибка, то получается как бы автоматический 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 во втором промисе.
Нормальное ли это поведение? И если да, то можно ли как-то в таком случае сделать общий обработчик для непредвиденных ошибок, которые могут возникнуть в одном из промисов? Чтобы скрипт не падал полностью