【问题标题】:Javascript function not returning updated objectJavascript函数不返回更新的对象
【发布时间】:2015-05-13 01:56:45
【问题描述】:

我编写了这个函数,当我运行它时,它返回 {}。当我在传递给 $('.price').filter 的函数中记录 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
};

【问题讨论】:

    标签: javascript json web-scraping cheerio


    【解决方案1】:

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

    1. 提出请求。
    2. 当请求返回响应时,执行我给你的这个函数(第 4 行)
    3. 返回json(仍为空),请求尚未完成。
    4. 请求已完成,因此它会执行您在第 4 行中提供的函数以及响应。

    您可以通过将您需要对响应执行的操作放入该函数中来修复它,或者学习如何操作promises。后者更简洁,可以很好地与节点配合使用。

    【讨论】:

      【解决方案2】:

      请求是异步的,所以return 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;
              });
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多