2016-04-11 9 views
0

Ich bin neu in der Welt der Callback-Hölle, und habe ein wenig festgefahren. Ich mache ein paar Analysen, also rufe ich jedes Mal, wenn eine Funktion aufgerufen wird, eine Funktion an, die eine Anfrage ausführt, um die Anfrage auf unserem Server zu protokollieren. In jeder dieser ursprünglichen Funktionen wird jedoch ein request.get erzeugt, um einige Informationen zurückzugeben. Also rufe ich im Wesentlichen eine Funktion auf, die eine Anfrage in eine andere Funktion stellt, die danach eine Anfrage stellen muss. Der Code selbst viel komplizierter ist (und kompliziert, ich meine lange und ärgerlich), als ich gerade beschrieben, also hier ist die abgespeckte Version:Nodejs Request gefolgt von Request - Synchronisationsproblem

function myFunction(x, y, callback) { 
    // variable declarations 
    postFunction(a, b); 
    // other logic for the function 
    request.get(url, function(error, response, body) { 
     // request code here 
     callback(somedata, otherFunctionThatDoesntMatterHere(blah)); 
    }); 
} 

function postFunction(a, b) { 
    // other logic for the function 
    var dataToSend = "XML HERE"; 
    request.post({ 
     url: url, 
     body: dataToSend, 
     headers: {'Content-Type' : 'text/xml'}, 
     function(error, response, body) { 
      if (error) { 
       console.log(error); 
      } 
      else if (response.statusCode !== 200) { 
       console.log('Invalid Status Code Returned:', response.statusCode); 
      } 
      else if (!error && response.statusCode == 200) { 
       console.log('POST RESPONSE: ', body); 
      } 
     } 
    ); 
} 

Was gerade passiert ist, dass die Post-Funktion doesn‘ t Rückkehr vor dem Ende der Hauptfunktion. Ich weiß, dass dies Teil der asynchronen Knoten-Knoten ist, aber ich möchte, dass diese synchron ausgeführt werden. Ich bin mir ziemlich sicher, dass ich das lösen kann, indem ich einen Callback zur Post-Funktion hinzufüge, aber ich bin mir nicht sicher, wie. Ich habe viele verschiedene Ansätze ausprobiert, aber leider verstehe ich nicht ganz, wie das alles funktioniert. Vielen Dank im Voraus für Ihre Hilfe!

Antwort

0

Wenn Sie wirklich wollen, dass es synchron ist, dann würden Sie ja einen Rückruf zu der postFunction hinzufügen müssen.

Zum Beispiel:

function myFunction(x, y, callback) { 
// variable declarations 
postFunction(a, b, function(err) { 
    // other logic for the function 
    //maybe check if "err" has a value here 
    request.get(url, function(error, response, body) { 
     // request code here 
     callback(somedata, otherFunctionThatDoesntMatterHere(blah)); 
    }); 
}); 

} 

function postFunction(a, b, next) { 
// other logic for the function 
var dataToSend = "XML HERE"; 
request.post({ 
    url: url, 
    body: dataToSend, 
    headers: {'Content-Type' : 'text/xml'}, 
    function(error, response, body) { 
     if (error) { 
      console.log(error); 
      next(error); 
     } 
     else if (response.statusCode !== 200) { 
      console.log('Invalid Status Code Returned:', response.statusCode); 
      next('Invalid Status Code Returned:' + response.statusCode); 
     } 
     else if (!error && response.statusCode == 200) { 
      console.log('POST RESPONSE: ', body); 
      next(null); 
     } 
    } 
); 
} 

Dies legt den Rest des Codes Sie innerhalb der Rückruf des postFunction abzufeuern wollen, ist es erforderlich erste anderes Feuer, bevor irgendetwas zu vervollständigen. Dies erhöht natürlich die Gesamtlaufzeit der Funktion, da sie nun warten muss, bevor sie weiterläuft. Seien Sie vorsichtig beim Sperren der Ereignisschleife, wenn Sie CPU-intensive Aufgaben ausführen.

, auch die Hässlichkeit der Callback-Hölle zu bekämpfen, können Sie so etwas wie Asynchron-Wasserfall zu Kettenfunktionen nacheinander verwenden: https://www.npmjs.com/package/async-waterfall

+0

Ich war buchstäblich über meine Lösung zu schreiben, die auf diese fast identisch ist. Ich wünschte, ich hätte das zuerst gesehen, haha. Danke :) – redcastle

+0

Haha, kein Problem! – AdmanStrong