Существует множество советов, которые помогут вам не допустить, чтобы отклоненные обещания оставались необработанными. Если вы этого не сделаете, советы предупреждают, что ошибки никогда не будут замечены и будут полностью проглочены. На консоль ничего не выводится.
Этот совет, похоже, устарел. Современные браузеры и современные версии Node, похоже, выводят предупреждения, когда отклоненные обещания не обрабатываются. Возьми этот код:
async function thisIsGoingToFail() {
await Promise.reject();
console.log('this should not print, as the line above should error');
}
async function main() {
await thisIsGoingToFail();
}
main();
Если вы запустите это в Node, вы получите:
(node:20760) UnhandledPromiseRejectionWarning: undefined
(node:20760) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:20760) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Стандартный совет заключается в том, что последняя строка в исходном коде должна выглядеть следующим образом, чтобы избежать проглоченных ошибок:
main().catch(err => { console.err(err) });
Но не похоже, что это было необходимо. Итак, вот мои вопросы:
- Правда ли, что современные браузеры и современный Node всегда будут показывать предупреждение для необработанных отклоненных обещаний? Какие номера версий реализации поддерживают это?
- (Обратите внимание, что браузер не должен поддерживать событие
unhandledrejection
, чтобы вывести предупреждение, когда обещание не обработано.)
- Нужно ли нам иметь функции верхнего уровня
catch
, как вам часто советуют, или же столь же полезно позволить реализации показывать предупреждение?