Brechen Sie die Versprechen-Kette und rufen Sie eine Funktion auf, die auf dem Schritt in der Kette basiert, in dem sie gebrochen ist (verworfen).

Aktualisieren:

Um zukünftigen Zuschauern dieses Beitrags zu helfen, habe ich erstelltDiese Demo von Plumas Antwort.

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 bei Schritt 1 versage, beidestepError(1) UNDstepError(2) sind gefeuert. Wenn ich nichtreturn $q.reject dannstepError(2) wird nicht gefeuert, aberstep(2) werde, 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 Damit hast du etwas zu tun.

Aktualisieren:

I So'ne Art habe es gelöst. Hier ertappe ich den Fehler am Ende der Kette und übergebe die Daten anreject(data) damit ich weiß, welches Problem in der Fehlerfunktion zu behandeln ist. Dies entspricht eigentlich nicht meinen Anforderungen, da ich nicht auf die Daten angewiesen sein möchte. Es wäre lahm, aber in meinem Fall wäre es sauberer, einen Fehlerrückruf an die Funktion zu übergeben, als von den zurückgegebenen Daten abhängig zu sein, um zu bestimmen, was zu tun ist.

Live-Demo hier (klicken).

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); 
  }

Antworten auf die Frage(9)

Ihre Antwort auf die Frage