2017-12-19 4 views
0

Ich versuche herauszufinden, wie Sie Fehler in der Versprechungskette richtig behandeln. Es gibt wenige Versprechen und einer von ihnen wirft Fehler. Im Fehlerfall möchte ich die Funktion in der Kette beenden.Verarbeitungsfehler in Versprechen

Die Fragen, die ich konfrontiert mit sind:

  1. Wie können wir nächste Anruf von catch-Block beenden?
  2. Wie kann man die Ausführungsreihenfolge dann() garantieren? Catch(). Then() chain? An diesem Moment beobachte ich, dass der catch-Block nach der Ausführung beider then() -Funktionen aufgerufen wird.

Codebeispiel:

function run() { 
    test().then(function(data) { 
     console.log("w3", "Print data: " + data); 
    }); 
} 

function test() { 
    return new Promise(function(fulfill, reject) { 
     ask() 
      .catch(err => console.log("w3", "Process error from ask: " + err)) 
      .then(reply()) 
      .catch(err => console.log("w3", "Process error from reply: " + err)) 
      .then(function(data) { 
       console.log("w3", "Finish test"); 
       fulfill(data); 
       // TODO finish data 
      }) 
    }); 
} 

function ask() { 
    return new Promise(function(fulfill, reject) { 
     console.log("w3", "ask"); 
     // fulfill("Hello"); 
     reject("Cancel Hello"); 
    }); 
} 

function reply() { 
    return new Promise(function(fulfill, reject) { 
     console.log("w3", "reply"); 
     fulfill("World!"); 
     // reject("Cancel World"); 
    }); 
} 
+4

die [ 'Promise' Konstruktor Antipattern] vermeiden (https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how (zu vermeiden)! – Bergi

+1

Wenn Sie '.catch' hinzufügen, das eine abgelehnte Zusage nicht zurückgibt oder einen Fehler ausgibt, haben Sie den Fehler" bearbeitet ", daher wird der nächste' .then' aufgerufen ... Promises 101 –

+2

'.dann (reply()) ".... erwartet dann eine ** Funktion ** als Argument, Sie liefern das Ergebnis des Aufrufs einer Funktion ...' .dann (antworten) 'wäre das, wonach Sie suchen - auch das ist Promsies 101 –

Antwort

1

Sie fangen nur am Ende der Kette. Wenn es einen Fehler gibt. Es wird die anderen then ignorieren und direkt zu fangen gehen.

Stellen Sie sicher, dass Sie "Versprechen" zurückgeben, andernfalls wird Ihr Fehler nicht angezeigt.

fulfill(data); sollte return fulfill(data);

+0

Vielen Dank für Ihre Hilfe! – Gleichmut

2

, das nicht ist, wie Versprechen Ketten Arbeit. Versprechen werden nur korrekt verkettet, wenn Sie explizit eine Promise aus jeder Funktion zurückgeben, die in Ihren Blöcken aufgerufen wurde. Wenn Sie keine Promise aus diesen Funktionen zurückgeben, wird sofort der nächste Block aufgerufen.

Sie wollen wahrscheinlich etwas tun:

function run() { 
    test() 
     .then(function (data) { 
      console.log("w3", "Print data: " + data); 
     }); 
} 

function test() { 
    return ask() 
     .then(function (result) { 
      return reply(); 
     }) 
     .then(function (data) { 
      console.log("w3", "Finish test"); 
      return Promise.resolve(data); 
     }) 
     .catch(function (error) { 
      console.log("Hey an error was thrown from somewhere"); 
      if(error instanceof UnexpectedAskError) { 
       //handle specific error logic here. 
      } 
     }); 
} 

function ask() { 
    console.log("w3", "ask"); 
    return Promise.reject(new UnexpectedAskError("Ask threw an error")); 
} 

function reply() { 
    console.log("w3", "reply"); 
    return Promise.resolve("World!"); 
} 

Beachten Sie, wie die Funktion fragen, eine bestimmte Art von Fehler zurückgibt? Sie können so etwas tun, wenn Sie eine andere Fehlerbehandlung durchführen müssen, abhängig davon, welche Funktion einen Fehler ausgelöst hat.

speziell auf die Fragen zu beantworten, die Sie gefragt:

  1. Das obige Verfahren verspricht Verkettungstag wird die nächste .then() dazu aufgerufen, verhindern, wenn ein Fehler durch die vorherige Funktion ausgelöst.
  2. Die obige Verkettungsmethode stellt sicher, dass Ihre Blöcke in der angegebenen Reihenfolge aufgerufen werden. Solange jede eine Funktion ist und jede Funktion eine Promise zurückgibt, entweder durch den Aufbau einer new Promise(function(resolve, reject)) oder durch Promise.resolve oder Promise.reject, wird die Kette in der richtigen Reihenfolge ausgeführt.
+0

Vielen Dank für Ihre Hilfe! – Gleichmut

Verwandte Themen