2016-11-24 11 views
0

コードを呼び出すセクション。要求外のデータは未定義

** 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 

私は、これはJSONオブジェクトをプリントアウトすることを期待しかし、undefinedを返します。

** 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 
} 

ここでの問題は、私はconsole.log(json);要求が終了する前ならば、それが正常に動作しますが、私は、要求(または別の関数)の外にそれを行うならば、それはundefinedを返しますということです。 (getItemURL()の同じ問題)

この問題を解決する方法はありますか?または、データの要求に関する基本的な考え方を見落としていますか?

Full Source Code if interested

すべてのヘルプやコメントは大歓迎されています。

答えて

1

主な問題は、非同期呼び出しを実行していて、結果を極度の方法で取得しようとしていることです。

要求機能第2パラメータは、要求が応答を受け取ったときに呼び出されるコールバックです。

だから、問題は次のとおりです。

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

あなたはコンソール出力があることを期待している:

A 
B 

が、出力は次のとおりです。機能はasyncronousですのでです

B 
A 

要求が応答を受け取ったときに呼び出され、要求iが実行されている間にコードが実行を継続しますその応答を待っている。

*私はあなたのコードをダウンロードし、それをテストするためにいくつかの変更を加えました。あなたに送ってもらいたいかどうか教えてください。