如何解决像“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创造了很多开销。

       

网上收集的解决方案 "如何解决像“asynchronous”和“请求”这样的节点库的“这个”问题"

你做得很对。

另一种方法是始终在上下文中保持对对象的引用,而不是使用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);