Возможно необработанная ошибка при возврате промиса внутри промиса

У меня есть следующий код:

SuccessfulPromise().then(function() {
    return rejectedPromise();
}).catch(function(err) {
    console.log(err);
});

Я намеренно получаю вышеуказанное сообщение об ошибке или это ошибка? Ошибка обрабатывается в блоке catch, и, несмотря на это, я получаю сообщение об ошибке Possibly unhandled Error.


person VuesomeDev    schedule 04.09.2014    source источник
comment
Не могли бы вы привести рабочий пример?   -  person thefourtheye    schedule 04.09.2014
comment
После успешного обещания в функции then я возвращаю отклоненное обещание с помощью Promise.reject(). Это в тесте, так что все издевались.   -  person VuesomeDev    schedule 04.09.2014
comment
Внешний блок catch перехватывает возвращенное отклоненное обещание внутри функции then, но по-прежнему выводит на консоль сообщение о возможной необработанной ошибке.   -  person VuesomeDev    schedule 04.09.2014
comment
Не могли бы вы создать jsFiddle, чтобы воспроизвести проблему?   -  person thefourtheye    schedule 04.09.2014
comment
Пожалуйста, покажите код rejectedPromise - он не будет воспроизводиться с return Promise.reject()   -  person Benjamin Gruenbaum    schedule 04.09.2014


Ответы (2)


Вы сказали:

Проблема была с sinon.stub().returns(Promise.rejected('error')). Обещание было выполнено до того, как было назначено обработчику ошибок.

Я хотел бы отметить, что это правильно. Когда обещание отклонено, Bluebird проверяет цепочку, чтобы увидеть, обработают ли его какие-либо обработчики ошибок, и если нет, это вызовет событие possiblyUnhandledRejection. Поэтому, если отклонение происходит до назначения обработчика, вы получаете «ложный отчет».

Однако! Есть причина, по которой она называется возможно: система по-прежнему обнаруживает обработку этой ошибки после того, как вы делаете назначение ей обработчика, и затем она инициирует событие UnhandledRejectionHandled как задокументировано. Вы можете использовать последнее событие, чтобы убедиться, что вас не беспокоят ложные необработанные отказы после их обработки.

person Avaq    schedule 09.09.2014
comment
Спасибо, это привело меня к моему ответу. Я закончил переписывать свой обработчик событий onPossiblyUnhandledRejection, чтобы он ничего не печатал. - person Gaston Sanchez; 18.11.2014

Проблема была с sinon.stub().returns(Promise.rejected('error')). Обещание было выполнено до того, как было назначено обработчику ошибок.

person VuesomeDev    schedule 04.09.2014
comment
О, так это было одно и то же отклоненное обещание, и оно было продублировано несколько раз? - person Benjamin Gruenbaum; 04.09.2014
comment
он не был продублирован, просто не получил обработчик ошибок при создании - person VuesomeDev; 05.09.2014
comment
Можете ли вы создать полный проверяемый пример кода и открыть проблему, пожалуйста (или обновить проблему, которую вы закрыли, и мы снова ее откроем?) - person Benjamin Gruenbaum; 05.09.2014
comment
Спасибо. Имея ту же проблему. Как ты это починил? Я имею в виду, что не хочу получать это уродливое сообщение об ошибке. - person Gaston Sanchez; 18.11.2014