2017-07-18 7 views
0

Ich habe Fragen über das Zurückgeben von Daten von einem Knoten JS-Anforderungsaufruf durchlaufen. Ein häufiger Fehler ist die Annahme, dass Anweisungen Zeile für Zeile oder synchron ausgeführt werden, was hier nicht der Fall ist. Eine Frage dieser Art: How to get data out of a Node.js http get request.Node.js Anfragefunktion gibt Daten zurück

Meine Frage ist ein bisschen anders. Ich habe eine Funktion getNumber() geschrieben, die die Anzahl der Ergebnisse für gegebene Abfrage zurückgibt. Ich frage mich, wie ich einen Wert zurückgeben, der von der Rückruffunktion abgerufen wird? So zum Beispiel:

function getNumResults() { 

Request(url, function(response) { 

    var responseJSON = JSON.parse(body); 
    return(responseJSON.results.count); 

    }); 

}

function Request(URL, callback) { 

request(URL, function(error, response, body) { 

    console.log('URL: ', URL); 
    console.log('error: ', error); 
    console.log('statusCode: ', response && response.statusCode); 
    console.log('body: ', body); 
    callback(body); 
}); 

}

Was passiert, wenn ich getNumResults() wollen responseJSON.results.count zurückzukehren? Wie könnte ich das tun?

Antwort

2

Was ist, wenn ich möchte, dass getNumResults() responseJSON.results.count zurückgibt? Wie könnte ich das tun?

Sie können einen asynchronen Wert nicht direkt von getNumResults() zurückgeben. Du kannst einfach nicht. Die Funktion gibt lange zurück, bevor der Wert überhaupt verfügbar ist. Es ist eine Frage des Timings. So funktionieren asynchrone Antworten. Sie beenden in der Zukunft einige unbestimmte Zeit, aber sie blockieren nicht, so dass der Rest Ihres Javascript weiterhin ausgeführt wird und die Funktion daher zurückkehrt, bevor das Ergebnis überhaupt verfügbar ist.

Der einzige Weg, um das Ergebnis herauszubekommen, ist mit einem Rückruf irgendeiner Art. Dies gilt sowohl für Ihre Request() Funktion als auch für unsere getNumResults() Funktion. Sobald ein Ergebnis asynchron ist, kann niemand in der Aufrufkette dem entkommen. Async ist ansteckend und Sie können niemals von asynchron zurück zu synchron gehen. Wenn Ihr getNumResults() den Wert an seinen Aufrufer zurückgeben möchte, muss er entweder einen Rückruf selbst akzeptieren und diesen Rückruf aufrufen, wenn er den Wert erhält, oder er muss ein Versprechen zurückgeben, das mit dem Wert aufgelöst wird.

Hier ist, wie Sie dies mit Versprechungen machen könnte (was die Zukunft der Asynchron-Entwicklung in Javascript sind):

// load a version of the request library that returns promise instead of 
// taking plain callbacks 
const rp = require('request-promise'); 

function getNumResults(url) { 
    // returns a promise 
    return rp(url).then(body => { 
     // make the count be the resolved value of the promise 
     let responseJSON = JSON.parse(body); 
     return responseJSON.results.count; 
    }); 
} 

Dann würden Sie getNumResults() wie dieses“

getNumResults(someURL).then(count => { 
    // use the count result in here 
    console.log(`Got count = ${count}`); 
}).catch(err => { 
    console.log('Got error from getNumResults ', err); 
}); 

verwenden FYI, ich denke, Sie können auch die request()-Bibliothek erhalten, um Ihre JSON-Antwort für Sie automatisch zu analysieren, wenn Sie möchten, indem Sie eine entsprechende Optionsetzen.

+0

Das war so klar, danke sooo viel !! – Diana

Verwandte Themen