Dies ist wahrscheinlich eine dumme Frage, aber in der Mitte der Versprechenskette, wie lehnen Sie ein Versprechen innerhalb einer der damaligen Funktionen ab? Beispielsweise:
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
});
Es gibt keinen Verweis mehr auf die ursprüngliche Auflösungs- / Ablehnungsfunktion oder den PromiseResolver. Soll ich nur hinzufügen return Promise.reject(validationError);
?
javascript
promise
Chinabuffet
quelle
quelle
throw validationError
Antworten:
Ja. Es ist jedoch nur in jQuery so kompliziert , mit einer Promise / A + -kompatiblen Bibliothek könnten Sie auch einfach
Ihr Code würde dann also so aussehen
quelle
.catch
fehlt, wird die ganze App mit einem ungehinderten Fehler in die Luft jagen.handler
forthen
synchron ist und die Ausnahme abgefangen werden kann. Wenn der Handler asynchron ist, muss er ein Versprechen zurückgeben, um es schließlich abzulehnen. Es macht für mich also Sinn, immer Promise.reject () zurückzugeben, anstatt zu werfen. Denn wenn Sie einen asynchronen Handler einsetzen, kann die Bibliothek ihn nicht abfangen und er wird stillschweigend übergeben. In acht nehmen..then
Handler für ein Versprechen sind :-) Wenn Sie eine nicht versprochene API verwenden,return Promise.reject()
hilft Ihnen dies sogar.p.then(function() { doAsync(function() { throw new Error("won't catch"); }); });
EDIT: oh okay, ich habe deinen Kommentar noch einmal gelesen, ich bin total bei dir, wir sind auf der gleichen Seite! Ich wollte das OP darauf hinweisen :)doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })
funktioniert dort auch nicht - es scheitert nur lautlos. Es sollte wirklich sein,doAsync().then(function() { throw new Error("will be caught"); })
wenn Sie mit Versprechungen arbeiten.