Situations
Wenn ich dies tun:Angular Versprechen - Chaining ablehnen und lösen Kanäle separat
cookFood().then(function(food) {
eatFood(food);
});
Ob cookFood ablehnt oder aufgelöst wird, wird eatFood ausgeführt werden. Ich will das nicht, da ich möchte, dass es nur ausgeführt wird, wenn es verrechnet wird, weil es dafür gemacht wurde, nicht für die Behandlung von Fehlern. Auch wenn ich dies tun:
cookFood().then(function(food) {
return eatFood(food);
}, function() {
console.error('Error coooking food');
return 'FOOD_ERROR';
}).then(function(food) {
return shitFood(food);
}, function(err) {
if (err === 'FOOD_ERROR') {
alert('Looks like there was an error cooking food...');
}
});
Ich werde nie eine Benachrichtigung erhalten, weil ich vor einem Fehlerhandler ausgeführt. Ich will das nicht, weil ich beides ausführen will. Auch "shitFood" wird aufgerufen, wenn ein Fehler aufgetreten ist, etwas unerwünscht.
Lösungen
Ich kenne Lösungen für beide Situationen. Ich denke nur, dass es "einen besseren Weg geben muss".
Zum ersten:
cookFood().then(function(food) {
eatFood(food);
}, angular.noop);
Jetzt eatFood nicht mit etwas genannt werden, die nicht Essen. Aber muss ich angular.noop jedes Mal verwenden, wenn ich den Fehler nicht behandeln will (weil ich das später in der Kette tun werde)?
Zum zweiten:
cookFood().then(function(food) {
return eatFood(food);
}, function() {
console.error('Error coooking food');
return $q.reject('FOOD_ERROR');
}).then(function(food) {
return shitFood(food);
}, function(err) {
if (err === 'FOOD_ERROR') {
alert('Looks like there was an error cooking food...');
}
});
Dies funktioniert, wie ich erwarten würde, aber ich denke, ich sollte nicht manuell ablehnen müssen, weil der Wert-Handler nicht manuell zu lösen hat.
Meistens möchte ich alle Missverständnisse beseitigen, die ich vielleicht habe, und über einen besseren Weg informiert werden. Vielen Dank.
ziemlich sicher, wenn 'cookFood()' ablehnt, 'eatFood()' wird nicht aufgerufen werden. – thedarklord47
nur doppelt überprüft, 'angular-Versprechen' sind Versprechen/A + konform, so dass Ihre ursprüngliche" Situation "sollte gut funktionieren. Ich denke, du solltest checkFood() überprüfen, um sicherzustellen, dass es tatsächlich löst. – thedarklord47
@ thedarklord47 Ja, das vorherige Versprechen war nicht wirklich abzulehnen, daher meine Verwirrung. Auch verstanden die falsche Art und Weise eine Erklärung von https://github.com/kriskowal/q (in meinem Kommentar zu der angenommenen Antwort erwähnt). – JoelSanchez