这有什么问题?试图在原型中使用请求回调......但收效甚微

时间:2014-05-20 20:15:16

标签: javascript node.js request cheerio

This Gist是我尝试使用回调来包含请求,以使用带有Request和Cheerio的Node.js从一系列网页中提取一些元素。最初我使用的基本逻辑只使用了一个函数。但是,我试图让它更加面向对象,显然失败了。由于之前的逻辑工作,我完全难以理解为什么它现在不起作用。

提前感谢您的协助。

要点:https://gist.github.com/knu2xs/5acc6f24c5df1c881cf7

1 个答案:

答案 0 :(得分:1)

你的一个问题是,第82行:

if (!error) {
    var $ = cheerio.load(body);

    // get properties from the html
    this.name_river.get($);
    this.name_reach.get($);
    this.difficulty.get($);
    this.length.get($);

}

内部回调函数未绑定到同一范围,因此this不是Reach实例。

你需要获取一个引用并改为使用它:

function Reach(reach_id) {
    /* ...  */

    var self = this;
    this.request = request(url_root + this.reach_id, function (error, response, body) {
        /* ...  */
        self.name_river.get($);
        /* ...  */
    });
}

...或明确地将其绑定到:

function Reach(reach_id) {
    /* ...  */

    this.request = request(url_root + this.reach_id, (function (error, response, body) {
        /* ...  */
        this.name_river.get($);
        /* ...  */
    }).bind(this));
}

关于this https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

的MDN文章

另一个问题是这里的电话,第104行:

reach.request();

如果我正确读取请求,请求未设置为某个功能。第79行在实例创建期间执行请求:

this.request = request(url_root + this.reach_id, function (error, response, body) {