2017-06-09 2 views
0

Ich bin sehr neu zu JS und Node. Ich versuche, eine Variable von einer asynchronen HTTP-Anfrage zurückzugeben, und ich erkenne, dass das Problem die asynchrone Natur des Anrufs ist, aber nicht herausfinden kann, wie man eine sehr einfache Codeausschnittfunktion trotz des Lesens mehrerer Tutorials macht.Node.js Asynchrone Rückkehr von HTTP-Anfrage

Kann jemand bitte dies so markieren, dass es funktioniert und ich es verdauen und für meinen eigenen Gebrauch modifizieren kann? Sollte ich die Async-Bibliothek verwenden? Ich habe ein paar Versuche unternommen und war nicht in der Lage, diese Arbeit zu machen.

var request = require('request'); 
 
a = 0; 
 

 
a = foo(); 
 
function foo() { 
 
    var num = 1; 
 
    request('http://www.google.com', function (error, response, body) { 
 
     // console.log('error:', error); // Print the error if one occurred 
 
     //console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
 
     //console.log('body:', body); // Print the HTML for the Google homepage. 
 
     num = 3; 
 
     return callback(num); 
 
    }) 
 
    return num; 
 
} 
 

 
console.log(a);

+0

Haben Sie Ihren Code debuggt? –

+0

Ihre Rückkehr kehrt irgendwo in das Modul * request * zurück –

Antwort

0

Ich gehe also davon aus, dass Sie Ihre Anfrage richtig stellen, und konzentrieren Sie sich stattdessen auf die Idee des Rückrufs. Wenn Sie dies versuchen und noch ein wenig mehr Hilfe benötigen, lassen Sie es mich wissen.

Ich werde versuchen, diesen Code zu halten nah an, was Sie bereits haben:

function foo(callback){ 
    request('http://www.google.com', function (error, response, body) { 
     if(error) 
     console.log(error); 
     //console.log('statusCode:', response && response.statusCode); 
     // Print the response status code if a response was received 
     //console.log('body:', body); // Print the HTML for the Google homepage. 
     num = 3; 
     callback(num); 
    }) 
} 

dann um eine 3 drucken Sie so etwas tun würde.

foo(function(value){ 
    console.log(value); 
}) 

Sie würden den Wert 3 in diesem Fall ausgedruckt sehen.

Wenn Sie mehr als nur 3 zurückgeben möchten, müssen Sie sie als Parameter an die übergebene Callback-Funktion übergeben. Wenn Sie versuchen würden, dem Callback-Stil mehr zu folgen, würden Sie wahrscheinlich etwas näher kommen.

Sie müssen nur daran denken, dass mit Rückrufen, wie Rob erwähnt, Sie normalerweise nicht zurückkehren. Stattdessen rufen Sie mit Ihrer Funktion eine andere übergebene Funktion auf und stellen diese Funktion mit Parametern zur Verfügung, die Ihre Funktion bestimmt hat.

+0

Danke! Das funktioniert eindeutig und erfordert, dass ich meinen Code anders strukturiere. Sehr geschätzt. Macht es Sinn, dies mit async/abwarten zu versuchen? – dave

+0

Ich gebe zu, dass ich mit Async nicht sehr vertraut bin. Mit so etwas Einfachem würde ich Async nicht erwarten. Für mich kommt es wirklich auf die Komplexität der Situation an. – Jeff

0

Sie müssen/können nur auf den Ergebnissen eines Asynchron-Anruf in seinem Rückruf arbeiten, da

  1. Rückrufe keine Werte zurückgeben,
  2. Rückrufe haben keinen Zugang zu Ihrem umgebenden Kontext, so in Ihrem Beispiel num ist nicht definiert, wenn der Rückruf ausgelöst wird, und
  3. Sie können nicht wissen, wann der Rückruf abgeschlossen ist und somit sein Ergebnis verfügbar ist.

In Ihrem Beispiel-Code, foo wird immer sofort Rückkehr 1 unabhängig von der Antwort/Körper zurück von request.