2016-06-09 15 views
0

Neu zu Versprechen, versuchen, den logischen Ablauf zu verstehen. Dachte ich habe verstanden, bis ich anfing, Fehler zu testen. Im folgenden Beispiel, wenn ich die 3. Zeile auskommentiere, warum wird die Ablehnung nicht in der Zusage zurückgegeben?Q Promise Auflösungs-/Ablehnungslogik - Warum wird das Versprechen nicht als abgelehnt zurückgegeben?

var Q = require("q") 
 

 
var getInstallBase = function() { 
 
    return new Promise(function(resolve, reject) { \t 
 
\t //var IBdata = 'temp IBdata'; // <------comment out so IBdata not defined 
 
    if (IBdata){ 
 
      resolve(IBdata); // State will be fulfilled 
 
     } else { 
 
\t  reject("error getting IBdata"); // State will be rejected \t \t \t   
 
     } 
 
    }); 
 
} 
 

 
var mungeIt = function(IBdata){ 
 
    return new Q.Promise(function(resolve,reject){ 
 
\t \t // get insight from data 
 
\t \t console.log('IBdata = ' + IBdata); 
 
\t \t var insight = 'temp insight'; 
 
     if (insight){ 
 
      resolve(insight); // State will be fulfilled 
 
     } else { 
 
      reject("error getting insight"); // State will be rejected 
 
     } 
 
    }) 
 
} 
 

 
var postResults = function(insight) { 
 
\t return new Promise(function(resolve, reject) { 
 
\t \t console.log('insight = ' + insight); 
 
\t \t // post result 
 
\t \t var objectID = '12345'; 
 
\t \t if (objectID){ 
 
\t \t \t setTimeout(function() { 
 
\t \t \t \t console.log('done waiting'); 
 
\t \t \t \t resolve(objectID); 
 
\t \t \t }, 2000); 
 
\t \t \t // State will be fulfilled 
 
\t \t } else { 
 
\t \t \t reject("error posting insight to object store"); // State will be rejected 
 
\t \t } 
 
\t }); 
 
}; 
 

 
(function extractInsightCycle() { 
 
\t getInstallBase().then(mungeIt).then(postResults).then(function(objectID) { 
 
\t \t console.log('object successfully posted, ID: ' + objectID) 
 
\t \t extractInsightCycle(); 
 
\t }).catch(function(error) { 
 
\t \t console.log('something went wrong', error); 
 
\t \t extractInsightCycle(); 
 
\t }) 
 
})();

+0

Was meinen Sie mit "* Reject wird nicht im Versprechen * zurückgegeben"? Wird der Callback nicht ausgeführt? – Bergi

Antwort

2

Bitte überprüfen Sie diese JSBin out: http://jsbin.com/zutotuvomo/edit?js,console

Es eine vereinfachte Version des Codes enthält, und wie Sie das Versprechen zurück von getInstallBase tatsächlich ablehnt sehen kann.

Wahrscheinlich etwas anderes in Ihrem Code sieht es so aus, als ob es nicht abgelehnt hat.

EDIT:

nahm ich noch einen Blick auf den Code, und das ist, was passiert - die abgelehnten Versprechen gefangen wird:

function(error) { 
    console.log('something went wrong', error); 
    extractInsightCycle(); 
} 

Welche der extractInsightCycle Anrufe, die die Funktion, die ist Initiierung des gesamten Prozesses, und das verursacht eine Endlosschleife (Endlosrekursion tatsächlich).

+0

Danke. Ja, du hast recht, es ist etwas anderes, das es so aussehen lässt, als ob es nicht ablehnt - und es läuft auf meinen Mangel an Verständnis hinaus. Hier ist, was ich nicht bekomme: – Dana

+0

Bitte sehen Sie meine bearbeitete Antwort. –

+0

1) Ich erwartete zu sehen, "Fehler IBData erhalten" zurückgegeben und irgendwo angezeigt, warum nicht? – Dana