To prawdopodobnie głupie pytanie, ale w połowie łańcucha obietnic, jak odrzucić obietnicę z wnętrza jednej z ówczesnych funkcji? Na przykład:
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
});
Nie ma już odniesienia do oryginalnej funkcji rozwiązywania / odrzucania ani do PromiseResolver. Czy mam tylko dodać return Promise.reject(validationError);
?
javascript
promise
podbródek
źródło
źródło
throw validationError
Odpowiedzi:
Tak. Jednak jest to tak skomplikowane tylko w jQuery, z biblioteką zgodną z Promise / A + można również po prostu
throw validationError;
Twój kod będzie wtedy wyglądał
someActionThatReturnsAPromise() .then(modifyResource) .then(function(modifiedResource) { if (!isValid(modifiedResource)) throw getValidationError(modifiedResource); // else ! return modifiedResource; }) .catch(function() { // oh noes });
źródło
.catch
brakuje, cała aplikacja będzie wysadzić z unhalted błędu ..handler
forthen
jest synchronizowany, a wyjątek można przechwycić. Jeśli program obsługi jest asynchroniczny, musi zwrócić obietnicę, aby ostatecznie ją odrzucić. Dlatego zawsze zwracanie Promise.reject () zamiast rzucania ma dla mnie sens. Ponieważ jeśli wrzucisz program obsługi asynchronicznej, biblioteka nie może go złapać i po cichu przejdzie. Strzec się..then
w ramach obietnicy :-) Jeśli używasz nie obiecanego interfejsu API, nawetreturn Promise.reject()
ci pomoże.p.then(function() { doAsync(function() { throw new Error("won't catch"); }); });
EDYCJA: och ok, ponownie przeczytałem twój komentarz, jestem całkowicie z tobą, jesteśmy na tej samej stronie! Chciałem zwrócić to uwagę na OP :)doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })
też nie działa - po prostu cicho zawodzi. Naprawdę powinno tak być,doAsync().then(function() { throw new Error("will be caught"); })
gdy pracujesz z obietnicami.