2016-09-02 5 views
0

Ich habe den folgenden Code:unerwartete Ausgabe, wenn q.js

 var p1 = Q($.ajax({ 
      url: "/api/test1" 
     })); 

     p1.then(function() { 
      console.log("success1"); 
     }); 

     p1.then(function() { 
      throw "some error"; 
      console.log("success2"); 
     }); 

     p1.then(function() { 
      console.log("success3"); 
     }); 

     p1.catch(function() { 
      console.log("failure1"); 
     }); 
     p1.catch(function() { 
      console.log("failure2"); 
     }); 

     p1.finally(function() { 
      console.log("finally1"); 
     }); 
     p1.finally(function() { 
      console.log("finally2"); 
     }); 

Ich erwarte die folgende Ausgabe davon aus, dass ich einige Daten zurück von api/test1 bekommen - „success1, failure1, failure2, finally1, finally2"

Was ich eigentlich "success1, success3, finally1, finally3"

"Success3" mir ist rätselhaft - warum wird der Code in die 2. ausbreitende dann, wenn eine Ausnahme aufgetreten?

Wie kann ich dies schreiben, damit ich irgendwelche Ausnahmen, die in den dann Teil (en) auftreten können, fangen kann?

Ta

Antwort

0

Der Grund „Success3“ zeigt, weil Ihre Versprechen sind nicht gekettet.
Grundsätzlich sind die "Dann" -Rufe (ebenso wie der "Fang" und "endlich") voneinander abhängig. Wenn Sie es als eine Baumstruktur betrachten, sind sie alle Kinder des p1 Versprechens. Wenn Sie möchten, dass sie abhängig sind, würden sie eine Beziehung zwischen Kind, Enkel, Urenkel usw. haben. Wenn Sie wollen, dass sie Kette zusammen, können Sie so etwas wie tun:

var p1 = Q($.ajax({ 
     url: "/api/test1" 
    })); 

    p1.then(function() { 
     console.log("success1"); 
    }).then(function() { 
     throw "some error"; 
     console.log("success2"); 
    }).catch(function() { 
     console.log("failure"); 
    }); 

die im Grunde implizit das Versprechen zurückkehrt, nachdem jede Funktion ausgeführt wird. Das nachfolgende "then" (oder catch/finally) wird auf diesen (impliziten) Rückgabewert angewendet.