UnhandledPromiseRejection
Разве я не уловил эту ошибку?
Теоретически, да. (Хорошо, для чего нужен блок catch?)
Технически нет.
Main Stack
| try |
| |
| await bar[0] | <-- waiting to resolve till sometime after 1200
| |
| catch |
| |
После (приблизительно) 200 миллисекунд :
бар [2] отклонен и помещен в очередь, но ожидание не дало, потому что он все еще ждал, пока бар [0] даст, что происходит только после 1200 миллис
Таким образом, на момент отклонения бара [2] блок catch
отсутствовал для обработки rejected promise
. Посмотрите вышеупомянутый стек и обратите внимание, что try..catch
и bar[2]
не находятся в одном стеке во время отклонения, ну, по крайней мере, по отношению к компилятору (или концептуально для javascript).
Но вы замечаете: err 3
, который ловит блок catch, когда, наконец, ожидают, дает bar[2]
Если вы измените порядок обещаний и поместите отклоненное обещание в качестве первого элемента в массиве, вы увидите, что блок catch работал хорошо.
Или ждем по-другому:
// unhandled rejection
try {
await bar[0]
await bar[1]
await bar[2]
} catch (e) {
console.error('error', e)
}
// Catch successfull
try {
await bar[2]
await bar[0]
await bar[1]
} catch (e) {
console.error('error', e)
}
Обновление:
Лучшим подходом было бы использовать Promise.all
, он работает без сбоев.
try {
const datas = await Promise.all(bar)
} catch (e) {
console.error(e)
}