3

У меня есть следующий код. И он работает как ожидалось, не бросая необработанную ошибку отклонения.Ошибка необработанного отказа Bluebird

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.catch (error) -> 
    console.log error 

Теперь второй пример кода бросить необработанную ошибку отбраковки. Может кто-нибудь объяснить мне, почему это происходит, когда я четко справляется с ошибкой.

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.then -> 
    console.log 'ok' 

p.catch (error) -> 
    console.log error 

Btw. Я проверяю в хроме и Bluebird v3.4.7

+0

Это CoffeeScript? Может быть, добавить тег coffeescript? – dtkaias

+0

Вы его coffeescript. просто добавил тег. –

ответ

1

Per error management configuration Bluebird Выдает ошибку, если не поймать обработчик зарегистрирован когда обещание отвергается, не дожидаясь, чтобы увидеть, если один будет добавлена ​​в будущем. Обратите внимание, что проверка для обработчика отклонения должна выполняться асинхронно с потоком, который устанавливает цепочку обещаний. Как говорится, «некоторые шаблоны программирования приведут к ложным срабатываниям». Да, действительно?

С другой стороны, ошибки неперехваченных исключений не являются частью стандарта ES6, и реализации обрабатывают их по-разному: Firefox ждет или используется для ожидания до момента GC, в то время как Chrome истекает (или используется для таймаута) с ошибка «возможного отказа от обезвреженного обещания».

Проконсультироваться с документацией на Blue Bird для возможных решений для Bluebird, обещая ошибку перед прикреплением обработчика.


Но поскольку оба примера синхронно присоединить обработчик отклонять для обещания p, причина исключения, как представляется, лежит в другом месте.

Благодаря ответу @DJ, но с другой интерпретацией. Во втором примере then возвращает обещание, которое отклоняется, если p отклонено и не имеет обработчика отклонения. Обещание, возвращенное .then, скорее всего, будет ошибкой.

+0

Но этот ответ не объясняет разницу между двумя отдельными кодовыми блоками в вопросе, поскольку оба они не имеют обработчика уловов, установленного при отклонении обещания. – jfriend00

+0

@ jfriend00 Я согласен, что первая часть ответа не объясняет эту ошибку. Я уточнил вторую часть. – traktor53

1

Когда вы связываете Посылы, каждая цепь рассматривается как новый экземпляр Promise.

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

Итак, в вашем примере 1: ваш catch() предназначен для устранения отклонения первоначальных обещаний, в которых была создана ошибка.

В примере 2: Он говорит, что, когда первое обещание разрешается, перейдите к 2-му обещанию, где вы предоставите обработчик успеха и неудачи. catch(), что у вас есть есть для обработки ошибки в функции в then(), а не один поднятый 1 Promise

Смотрите https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch для получения дополнительной информации о том, как поймать работает

+0

Но если вы запустите код, вы увидите, что ошибка записывается на консоль как необработанная ошибка отклонения. Таким образом, 'catch()' обрабатывает ошибки в первом обещании. Разве это не кажется немного странным. Почему catch будет выполняться, если bluebird сообщает мне, что ошибка не обрабатывается. –