0

这个要点是我一直在尝试包含一个带有回调的请求,以使用带有 Request 和 Cheerio 的 Node.js 从一系列网页中提取一些元素。最初,我使用的基本逻辑仅是一个函数。但是,我正在尝试使它更加面向对象,并且显然失败了。由于该逻辑以前有效,我完全不知道为什么它现在不起作用。

预先感谢您的协助。

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

4

1 回答 1

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));
}

在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this上的 MDN 文章this


另一个问题是这里的调用,第 104 行:

reach.request();

如果我没看错,请求没有设置为函数。第 79 行在实例创建期间执行请求:

this.request = request(url_root + this.reach_id, function (error, response, body) {
于 2014-05-20T20:36:07.170 回答