这个要点是我一直在尝试包含一个带有回调的请求,以使用带有 Request 和 Cheerio 的 Node.js 从一系列网页中提取一些元素。最初,我使用的基本逻辑仅是一个函数。但是,我正在尝试使它更加面向对象,并且显然失败了。由于该逻辑以前有效,我完全不知道为什么它现在不起作用。
预先感谢您的协助。
这个要点是我一直在尝试包含一个带有回调的请求,以使用带有 Request 和 Cheerio 的 Node.js 从一系列网页中提取一些元素。最初,我使用的基本逻辑仅是一个函数。但是,我正在尝试使它更加面向对象,并且显然失败了。由于该逻辑以前有效,我完全不知道为什么它现在不起作用。
预先感谢您的协助。
您的问题之一在这里,第 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) {