This Gist是我尝试使用回调来包含请求,以使用带有Request和Cheerio的Node.js从一系列网页中提取一些元素。最初我使用的基本逻辑只使用了一个函数。但是,我试图让它更加面向对象,显然失败了。由于之前的逻辑工作,我完全难以理解为什么它现在不起作用。
提前感谢您的协助。
答案 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
另一个问题是这里的电话,第104行:
reach.request();
如果我正确读取请求,请求未设置为某个功能。第79行在实例创建期间执行请求:
this.request = request(url_root + this.reach_id, function (error, response, body) {