我已经编写了一个node脚本,通过请求REST API数据(使用request库)来获取一些数据。它由一些函数组成,就像这样:
这一切都很顺利,但是我想把所有内容放在一个对象模式中,这样我就可以同时获取多个账户:
var data = { /* object to store all data */ },
function getKloutData() {
request(url, function() { /* store data */}
}
// and a function for twitter data
因为我想在获取所有数据后执行一些操作,所以我使用了async库来运行所有的fetch函数,代码如下:
async.parallel([ getTwitterData, getKloutData ], function() {
console.log('done');
});
这一切都很顺利,但是我想把所有内容放在一个对象模式中,这样我就可以同时获取多个账户:
function Fetcher(name) {
this.userID = ''
this.user = { /* data */ }
this.init();
}
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData, this.getKloutData ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
request(url, function () { /* store data */ });
};
由于async和request改变了this上下文,所以此方法无法正常工作。我唯一能想到的解决办法就是将所有通过async和request传递的内容绑定起来:
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData.bind(this), this.getKloutData.bind(this) ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
function saveData() {
/* store data */
}
request(url, saveData.bind(this);
};
我是不是做了一些基本错误或者其他的事情?我认为回滚脚本并将其分叉到子进程会创建太多的开销。
bindAll
,可以使这个过程变得不那么痛苦。如果您选择使用CoffeeScript,您可以使用箭头函数定义方法,这样就不需要进行任何显式绑定了。 - Jimmy