Странное поведение при выдаче Promise с ошибкой «Отклонение необработанного обещания» - PullRequest
0 голосов
/ 03 сентября 2018

Когда я запускаю этот код с помощью Node, он выдает ошибку Unhandled promise rejection в консоли (даже сначала показывая текст error caught).

const promise = new Promise((resolve, reject) => setTimeout(reject, 1000))
promise.then(() => console.log('ok'))
promise.catch((e) => console.log('error caught'))

Тем не менее, когда я связываю метод catch с методом then, ошибка исчезает:

const promise = new Promise((resolve, reject) => setTimeout(reject, 1000))
promise.then(() => console.log('ok')).catch((e) => console.log('error caught'))

Разве первый код не должен обрабатывать отклонение?

Я также попробовал первый код в Chrome, и он работает, если я открываю инспектор, когда нахожусь в новой вкладке (или google.com). Если я нахожусь на любой другой странице (например, stackoverflow.com), она выдает исключение. Любое объяснение этому? Это кажется мне очень странным!

1 Ответ

0 голосов
/ 04 сентября 2018

Чтобы считаться обработанным, отклоненные обещания должны быть синхронно связаны с then(..., ...) (2 аргумента) или catch(...).

promise.then(() => console.log('ok')) - это отдельное обещание, которое не было приковано к catch(...), поэтому отклоненное обещание приведет к необработанному отклонению.

Если я нахожусь на любой другой странице (например, stackoverflow.com), она выдает исключение

Это не исключение, оно не мешает нормальной работе скрипта. Способ обработки необработанных отклонений зависит от реализации Promise. Реализация Chrome по умолчанию приводит к ошибке консоли Uncaught (in promise).

То, что он не отображается на некоторых веб-сайтах в Chrome, означает, что на веб-сайте настроен обработчик unhandledrejection , который подавляет вывод ошибок.

...