Почему ошибка, возникшая во время выполнения промиса в Promise.all, не попадает в блок catch?

Как правильно обрабатывать не пойманные ошибки, которые возникают в промисах, переданных в `Promise.all`? Как настроить общий обработчик для таких случаев, чтобы предотвратить полное падение скрипта?
  • 4 апреля 2024 г. 11:59
Ответы на вопрос 2
Ошибка, возникшая во время выполнения промиса в `Promise.all`, не попадает в блок catch, потому что `Promise.all` возвращает промис, который завершается, когда все переданные ему промисы завершены. В этом случае происходит обработка результата выполнения всех промисов, но не отдельных ошибок.

Чтобы правильно обрабатывать не пойманные ошибки, которые возникают в промисах, переданных в `Promise.all`, можно использовать метод `Promise.allSettled()`, который возвращает промис, завершающийся после завершения всех промисов, независимо от их результата (успеха или ошибки). Далее можно проверить каждый результат на наличие ошибки и обработать их.

Пример:

```javascript
Promise.allSettled([
  fetch('https://api.example.com/data'),
  fetch('https://api.example.com/other-data')
])
  .then(results => {
    results.forEach(result => {
      if (result.status === 'rejected') {
        console.error('Error:', result.reason);
      }
    });
  });
```

Чтобы настроить общий обработчик для всех не пойманных ошибок в промисах, переданных в `Promise.all`, можно обернуть вызов `Promise.all` или `Promise.allSettled` в try-catch блок и внутри обрабатывать любые ошибки, которые могут возникнуть.

Пример:

```javascript
try {
  await Promise.all([
    somePromise(),
    anotherPromise()
  ]);
} catch (error) {
  console.error('Unhandled error:', error);
}
```

Таким образом, можно предотвратить полное падение скрипта и более гибко управлять обработкой ошибок, возникающих в промисах, переданных в `Promise.all` или `Promise.allSettled`.
чтобы промис зареджектился из-за throw, в нем случившемся, оный throw должен произойти синхронно. А у тебя - по таймауту. 
Для асинхронного реджекта надо функцию reject вызвать.
Похожие вопросы