Javascript函数未返回更新的对象

时间:2015-05-13 01:56:45

标签: javascript json web-scraping cheerio

我写了这个函数,当我运行它时,它返回{}。当我在传递给$(' .price')。过滤器的函数中记录json时,它显示json对象已使用正确的数据进行更新。但是,在我的函数结束时,它返回一个空对象。我不明白发生了什么。非常感谢帮助。谢谢!

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


module.exports = function scraper(url) {
    var json = {};
    request(url, function (error, response, html) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);
            $('.price').filter(function () {
                var data = $(this);
                json.price = data.text();
                console.log(json);
            });
        }
    });
    return json
};

2 个答案:

答案 0 :(得分:2)

return json在您传递给请求的函数(回调)之前发生。执行顺序如下:

  1. 提出请求。
  2. 当请求回复时,执行此函数我给你(第4行)
  3. 返回json(仍为空),请求尚未完成。
  4. 请求已完成,因此它会执行第4行中给出的响应函数。
  5. 您可以通过在响应函数中放置响应所需的内容或学习promises来修复它。后者更清洁,与节点配合得很好。

答案 1 :(得分:0)

请求是异步的,所以返回json 将返回一个空对象,你可以把它放在请求回调中:

request(url, function (error, response, html) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        $('.price').filter(function () {
            var data = $(this);
            json.price = data.text();
            console.log(json);
            return json;
        });
    }
});