2016-11-22 4 views
1

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.

+1

ziemlich sicher, wenn 'cookFood()' ablehnt, 'eatFood()' wird nicht aufgerufen werden. – thedarklord47

+0

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

+0

@ 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

Antwort

5

Wenn ich cookFood().then(eatFood); mache, ob cookFood ablehnt oder löst, wird eatFood ausgeführt.

Nein, das ist nicht wahr. eatFood wird nur ausgeführt werden, wenn cookFood erfüllt. Sie müssen nicht noop oder null oder etwas als Ablehnungshandler übergeben, um dieses Verhalten zu erhalten. Diese

cookFood().then(function(food) { 
    return eatFood(food); 
}, function() { 
    console.error('Error coooking food'); 
    return $q.reject('FOOD_ERROR'); 
}).then(…); 

funktioniert, wie ich erwarten würde, aber ich denke, ich sollte nicht manuell müssen ablehnen, weil der Wert-Handler nicht manuell zu lösen hat.

Ja, Sie müssen immer manuell return einen Wert, wenn Sie ein Ergebnis signalisieren möchten. Ob das ein einfacher Wert ist, ein Versprechen, das erfüllt wird oder ein Versprechen, das abgelehnt wird, hängt vom gewünschten Verhalten ab.

Aber Sie haben nicht zu einer abgelehnten Versprechen zurückkehren, können Sie auch nur eine Ausnahme:

cookFood().then(eatFood, function() { 
    console.error('Error coooking food'); 
    throw new Error('FOOD_ERROR'); 
}).then(…); 
+0

"Wenn ich KochenFood(). Dann (issFood);, ob CookFood ablehnt oder löst, EssenFood wird ausgeführt werden." Sieht so aus, als würde ich dies erleben, weil im vorherigen Schritt in der Kette kein abgelehntes Versprechen zurückgegeben wurde, und irrtümlicherweise dachte, dass dies auf das zurückzuführen ist, was dieser Ausdruck betrifft: "Wenn das Versprechen getInputPromise() abgelehnt wird und Sie Wenn Sie den Ablehnungs-Handler weglassen, wird der Fehler an outputPromise gehen: " (von https://github.com/kriskowal/q) Haben Sie es. Akzeptieren :) – JoelSanchez

Verwandte Themen