2016-11-24 59 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

主要问题是您正在进行异步调用,并期望以一种重要的方式获得结果。

请求函数第二个参数是当请求获得响应时调用的回调函数。

所以问题是:

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

您所期待的控制台输出为:

A 
B 

但输出是:

B 
A 

这是因为该功能是asyncronous并且当请求得到响应时它将被调用,并且代码在请求i时继续执行等待这种回应。 *我已经下载了你的代码,并且改变了一些东西来测试它,告诉我你是否希望我把它发送给你。