Esta é provavelmente uma pergunta boba, mas no meio da cadeia de promessa, como você rejeita uma promessa de dentro de uma das funções then? Por exemplo:
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
});
Não há mais uma referência à função original de resolução / rejeição ou ao PromiseResolver. Devo apenas adicionar return Promise.reject(validationError);
?
javascript
promise
chinabuffet
fonte
fonte
throw validationError
Respostas:
Sim. No entanto, é tão complicado apenas em jQuery, com uma biblioteca compatível com Promise / A +, você também pode simplesmente
throw validationError;
Então, seu código ficaria assim
someActionThatReturnsAPromise() .then(modifyResource) .then(function(modifiedResource) { if (!isValid(modifiedResource)) throw getValidationError(modifiedResource); // else ! return modifiedResource; }) .catch(function() { // oh noes });
fonte
.catch
estiver faltando, todo o aplicativo irá explodir com um erro inalterado.handler
forthen
é sync e a exceção pode ser detectada. Se o manipulador for assíncrono, ele terá que retornar uma promessa para rejeitar eventualmente. Portanto, sempre retornar Promise.reject () em vez de jogar faz sentido para mim. Porque se você lançar um manipulador assíncrono, a biblioteca não poderá detectá-lo e ele passará silenciosamente. Cuidado..then
manipuladores sob uma promessa :-) Se você estiver usando uma API não prometida, o mesmoreturn Promise.reject()
irá ajudá-lo.p.then(function() { doAsync(function() { throw new Error("won't catch"); }); });
EDITAR: ah ok, eu reli seu comentário, estou totalmente com você, estamos na mesma página! Queria apontar isso para o OP :)doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })
também não funciona lá - ele apenas falha silenciosamente. Realmente deveria serdoAsync().then(function() { throw new Error("will be caught"); })
quando você está trabalhando com promessas.