如何解决像“asynchronous”和“请求”这样的节点库的“这个”问题
我写了一个节点脚本,通过请求REST API数据(使用库请求)来获取一些数据。 它由几个function组成,如下所示:
var data = { /* object to store all data */ }, function getKloutData() { request(url, function() { /* store data */} } // and a function for twitter data
因为我想在获取所有使用库asynchronous之后执行一些操作来运行所有获取函数,如下所示:
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 */ }); };
这不起作用,因为asynchronous和请求改变了这个上下文。 我能解决这个问题的唯一方法是通过绑定我通过asynchronous和请求传递的所有东西:
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); };
我在做一些基本的错误还是什么? 我认为恢复到脚本,并将其分叉到child_processes创造了很多开销。
你做得很对。
另一种方法是始终在上下文中保持对对象的引用,而不是使用bind
,但这需要一些体操:
Fetcher.prototype.init = function() { var self = this; async.parallel([ function(){ return self.getTwitterData() }, function(){ return self.getKloutData() } ], function() { console.log('done'); }); } Fetcher.prototype.getKloutData = function(callback) { var self = this; function saveData() { // store data self.blah(); } request(url, saveData); };
您也可以事先进行绑定:
Fetcher.prototype.bindAll = function(){ this.getKloutData = this.prototype.getKloutData.bind(this); this.getTwitterData = this.prototype.getTwitterData.bind(this); }; Fetcher.prototype.init = function(){ this.bindAll(); async.parallel([ this.getTwitterData, this.getKloutData ], function() { console.log('done'); }); };
您可以将其保存到另一个variables中:
var me = this;
那me
就是你的
用这个函数实例化对象:
function newClass(klass) { var obj = new klass; $.map(obj, function(value, key) { if (typeof value == "function") { obj[key] = value.bind(obj); } }); return obj; }
这将自动绑定所有的函数,所以当对象中的方法具有对象的上下文时,您将获得习惯的OOP风格的对象。
所以你实例化你的对象不是通过:
var obj = new Fetcher();
但:
var obj = newClass(Fetcher);