2016-11-24 1 views
0

Abschnitt, der den Code aufruft.Daten außerhalb der Anforderung sind nicht definiert.

** index.js **

var express = require('express'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var RagialJS  = express(); 

RagialJS.get('/scrape', function(req, res){ 

    console.log(getItemJSON("Minor Brisket", "Renewal")); 

}) // End RagialJS.get 

Ich erwarte, dass dies ein JSON-Objekt drucken, gibt aber nicht definiert.

** getItemJSON() **

// Returns buy, sell, and metrics of item as a JSON 
function getItemJSON(itemName, server) { 
    var url = getItemURL(itemName, server); 
    request(url, function(error, response, html) { 
    if(!error && response.statusCode == 200) { 
     var $ = cheerio.load(html); 

     // Logic that parses and puts data in JSON here... 

     // console.log(json); works here 
     return json; 
     } else { 
      console.log(error); 
     } 
    }); // End request 
// console.log(json); DOESN'T works here 
} 

Das hier Problem ist, dass, wenn ich console.log(json);, bevor die Anforderung endet dann funktioniert es gut, aber wenn ich es außerhalb des Antrags zu tun (oder eine andere Funktion), dann gibt es nicht definiert. (Dasselbe Problem für getItemURL())

Gibt es eine Möglichkeit, dieses Problem zu beheben? Oder übersehe ich eine grundlegende Idee über Datenanforderungen?

Full Source Code if interested

Jede Hilfe oder Kommentare sind willkommen.

Antwort

1

Das Hauptproblem besteht darin, dass Sie Async-Aufrufe ausführen und erwarten, die Ergebnisse auf eine sinnvolle Weise zu erhalten.

Der zweite Parameter der Anfragefunktion ist ein Rückruf, der aufgerufen wird, wenn die Anfrage eine Antwort erhält.

Das Problem ist also:

request(url, function(error, response, html) { 
    console.log('A'); 
}) // End Request 
console.log('B'); 

Sie erwarten, dass die Konsole ausgegeben:

A 
B 

aber die Ausgabe ist:

B 
A 

Das ist, weil die Funktion asynchroner ist und es wird aufgerufen, wenn die Anfrage eine Antwort erhält, und der Code wird weiter ausgeführt, während die Anfrage i Ich warte auf diese Antwort.

* Ich habe Ihren Code heruntergeladen und einige Dinge geändert, um es zu testen, sagen Sie mir, wenn Sie möchten, dass ich es Ihnen sende.

Verwandte Themen