2013-05-30 12 views
8

Ich versuche, einen guten Weg, um herauszufinden, zu sagen, „all diese Dinge zu tun, aber gegen Kaution im Fall, dass einer von ihnen ausfällt“Stoppen eine AngularJS Versprechen Kette

Was ich jetzt habe:

Was ich letztlich will, ist irgendwie Fehler in dieser Kette zu fangen, so kann ich es auf die defer Versprechen oben weiterleiten. Es ist mir egal, ob die Syntax ähnlich wie oben ist.

Oder auch wenn mir jemand nur sagen kann, wie man die obige Kette stoppt.

+1

@ user2246674 - Ablehnen scheint es nicht die Kette zu stoppen, aber die nächste setzt einfach fort –

+1

Weiß nicht, was ich dachte .. – user2246674

+2

Dies ist ein schreckliches Beispiel der [latente Antipattern] (http: //stackoverflow.com/q/23803743/1048572)! Screw that 'defer', einfach' this.load (...) zurückgeben. Dann (A). Dann (B). Dann (C). Dann (D); "Kette! – Bergi

Antwort

2

Sie sollten in der Lage sein, die gleiche Sache zu tun durch:

var defer = $q.defer(); 

this 
    .load(thingy) // returns a promise 

    .then(this.doSomethingA.bind(this), $q.reject) 
    .then(this.doSomethingB.bind(this), $q.reject) 
    .then(this.doSomethingC.bind(this), $q.reject) 
    .then(this.doSomethingD.bind(this), $q.reject) 

    .then(defer.resolve.bind(defer, this), defer.reject.bind(defer)); 
    ; 

return defer.promise; 
+3

Diese Antwort verwendet ein Anti-Pattern und bewirkt, dass der Benutzer die Fehlerbehandlung wiederholt. –

0

Okay, das funktioniert, aber ich mag es nicht ... Erwarte etwas besser :)

Es scheint nur schmutzig ein Versprechen für den alleinigen Zweck der sofort zurückgewiesen es

myApp 
    .factory('chainReject', [ '$q', function($q){ 
     return function(err){ 
      var defer = $q.defer(); 
      defer.reject(err); 

      return defer.promise; 
     } 
    } ]); 

... 

var defer = $q.defer(); 

this 
    .load(thingy) // returns a promise 

    .then(this.doSomethingA.bind(this), chainReject) 
    .then(this.doSomethingB.bind(this), chainReject) 
    .then(this.doSomethingC.bind(this), chainReject) 
    .then(this.doSomethingD.bind(this), chainReject) 

    .then(defer.resolve.bind(defer, this), defer.reject.bind(defer)); 
    ; 

return defer.promise; 
5

Sie können angularjs Kette stoppen, indem Sie zurückgewiesene Versprechen in jedem dann Callback zurückgeben.

load() 
.then(doA) 
.then(doB) 
.then(doC) 
.then(doD); 

wo doA, DOB, doC, DOD kann Logik wie dieses:

var doA = function() { 
    if(shouldFail) { 
     return $q.reject(); 
    } 
} 
+1

+1 Was war es für mich ist der 'return' Teil von' return $ q.reject() '. Viele Suchen führten zu allen möglichen Arten, aber um das $ q zurückzugeben.reject(), anstatt es nur aufzurufen, ist das, was die Kette tatsächlich tötet. Vor allem, wenn Sie versuchen, etwas zu tun, das kein HTTP-Fehler ist, sondern ein "Fehler" in dem Sinne, dass das Modell mit einer erwarteten negativen Antwort zurückgegeben wurde. – coblr

+0

Ein anderer Weg, um die Kette zu stoppen, sagen Sie, dass Fehler angezeigt werden sollen, die während der Ausführung der Kette aufgetreten sind, können Sie einfach 'throw new Error()' –

+0

Zurückgewiesene Versprechen wird die Kette nicht stoppen. – user3631341

3

ich über diese nur gestolpert und realisiert alle diese Antworten schrecklich veraltet sind. Hier ist der richtige Weg, um dies für jeden, der diesen Beitrag findet, zu behandeln.

+0

'.catch' war nicht in eckigen' $ q', wenn diese Frage gestellt wurde :) –

+0

@zyklus, Sie sind richtig, aber '.catch' ist nur ein Alias ​​für' .then (null, fn) '. Was hätte damals gelten sollen. –

+0

Es wurde nicht verwendet, um Fehler zu übergeben, d. H. Es würde nur Fehler von dem vorherigen 'then' erhalten, weshalb ich den ganzen Kettenabweisungs-Unsinn unten geschrieben habe. –

0

Der beste Weg, dies zu handhaben und auch das Problem zu fangen, ist der .catch-Block. Innerhalb jeder .then Block, dass Sie die Versprechen Kette will töten, ja Einsatz:

return $q.reject(); 

es jedoch verlängern, wie so ...

return $q.reject(new Error('Error Message Here')); 

nun in der Fangmethode haben Sie diese

.catch(function(err) { 
    console.log(err); //This will log the above 'Error Message Here' 
}); 

Nun wir werfen und behandeln den Versprechen Fehler richtig in der Mode Versprechen Fehler sollten behandelt werden.

Verwandte Themen