Aktualisieren:
Um zukünftigen Zuschauern dieses Beitrags zu helfen, habe ich diese Demo von Plumas Antwort erstellt .
Frage:
Mein Ziel scheint ziemlich einfach zu sein.
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
Das Problem hierbei ist, dass, wenn ich in Schritt 1 versage, beide stepError(1)
UND stepError(2)
ausgelöst werden. Wenn ich es nicht tun , return $q.reject
dann stepError(2)
wird nicht gefeuert werden, aber step(2)
wird, was ich verstehe. Ich habe alles erreicht, außer was ich versuche zu tun.
Wie schreibe ich Versprechen, damit ich bei Ablehnung eine Funktion aufrufen kann, ohne alle Funktionen in der Fehlerkette aufzurufen? Oder gibt es einen anderen Weg, dies zu erreichen?
Hier ist eine Live-Demo , mit der Sie arbeiten können.
Aktualisieren:
Ich habe es irgendwie gelöst. Hier fange ich den Fehler am Ende der Kette ab und übergebe die Daten an, reject(data)
damit ich weiß, welches Problem in der Fehlerfunktion zu behandeln ist. Dies entspricht eigentlich nicht meinen Anforderungen, da ich nicht von den Daten abhängig sein möchte. Es wäre lahm, aber in meinem Fall wäre es sauberer, einen Fehlerrückruf an die Funktion zu übergeben, anstatt sich auf die zurückgegebenen Daten zu verlassen, um zu bestimmen, was zu tun ist.
step(1)
.then(function() {
return step(2);
})
.then(function() {
return step(3);
})
.then(false,
function(x) {
stepError(x);
}
);
function step(n) {
console.log('Step '+n);
var deferred = $q.defer();
(n === 1) ? deferred.reject(n) : deferred.resolve(n);
return deferred.promise;
}
function stepError(n) {
console.log('Error '+n);
}
Promise.prototype.catch()
Beispiele auf MDN zeigen eine Lösung für genau dieselben Probleme.