Вероятно, это глупый вопрос, но в середине цепочки обещаний, как вы отклоняете обещание изнутри одной из функций then? Например:
someActionThatReturnsAPromise()
.then(function(resource) {
return modifyResource(resource)
})
.then(function(modifiedResource) {
if (!isValid(modifiedResource)) {
var validationError = getValidationError(modifiedResource);
// fail promise with validationError
}
})
.catch(function() {
// oh noes
});
Больше нет ссылки на исходную функцию разрешения / отклонения или PromiseResolver. Я просто должен добавить return Promise.reject(validationError);
?
javascript
promise
Chinabuffet
источник
источник
throw validationError
Ответы:
Да. Однако это сложно только в jQuery, с библиотекой, совместимой с Promise / A +, вы также можете просто
throw validationError;
Тогда ваш код будет выглядеть как
someActionThatReturnsAPromise() .then(modifyResource) .then(function(modifiedResource) { if (!isValid(modifiedResource)) throw getValidationError(modifiedResource); // else ! return modifiedResource; }) .catch(function() { // oh noes });
источник
.catch
, все приложение взорвется с непогрешимой ошибкой ..handler
forthen
- это синхронизация и исключение можно перехватить. Если обработчик является асинхронным, он должен вернуть обещание, чтобы в конечном итоге отклонить. Поэтому для меня всегда имеет смысл возвращать Promise.reject () вместо того, чтобы бросать. Потому что, если вы добавите асинхронный обработчик, библиотека не сможет его поймать, и он молча пройдет. Осторожно..then
обработчиками обещания :-) Если вы используете не обещанный API, тогда дажеreturn Promise.reject()
вам поможет.p.then(function() { doAsync(function() { throw new Error("won't catch"); }); });
РЕДАКТИРОВАТЬ: о, хорошо, я перечитал ваш комментарий, я полностью с вами, мы на одной странице! Я хотел указать на это OP :)doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })
тоже не работает - просто тихо выходит из строя. Это действительно должно быть,doAsync().then(function() { throw new Error("will be caught"); })
когда вы работаете с обещаниями.