2013-02-08 64 views
1

我是javascript/nodejs的新手,我正在嘗試清理它的代碼。清理Javascript/Nodejs代碼

我正在使用async nodejs庫來處理使代碼的異步部分更容易。

現在的代碼如下所示:

Object.prototype.method = function(){ 
    var self = this; 
    // bunch of code 
    async.forEach(self.someArr, function(someObj, callback){ 
    self.somefunc(someObj.someProp, function(err, aNewObj) { 
     if (err) { 
     return callback(err); 
     } 

     self.someOtherArr.push(aNewObj.someOtherProp); 
     callback(); 
    }); 
}, callback); 
} 

但是,我想和另一個名爲功能上對象的原型也被定義來代替匿名函數。由於代碼的結構化方式,我不知道如何創建一個新函數來傳入async.forEach,同時保留正確的self值。

我想要什麼它看起來像:

AnObject.prototype.method = function(){ 
    var self = this; 
    // bunch of code 
    async.forEach(self.someArr, self._newMethod, callback); 
} 

AnObject.prototype._newMethod = function(someObj, callback){ 
    var self = this; 
    self.somefunc(someObj.someProp, function(err, aNewObj) { 
    if (err) { 
     return callback(err); 
    } 
    self.someOtherArr.push(aNewObj.someOtherProp); 
    callback(); 
    }); 
} 

但是,這顯然並不因爲上下文變化的工作。

+0

如果命名的函數在內部也使用變量'self',它應該沒有區別。唯一可能有趣的是如果它使用'this'。 – 2013-02-09 00:07:45

+0

我更新了我的問題,使其更加清晰。命名的函數也使用self。 – 2013-02-09 00:58:09

回答

2

除非該功能是在自我存在相同的封閉定義,你需要使用一些代理到它:

async.forEach(self.someArr, function(someObj, callback){ 
    self.somefunc(someObj.someProp, function(err, aNewObj) { 
     self.otherfunc(err, aNewObj, callback); 
    }); 
}, callback); 
+0

這與關閉與js開始。 – 2013-02-10 18:47:15

1

你可以做這個工作,如果你改變你的風格有點不夠輕鬆。

AnObject = function() { 
    var self = this; 

    self.method = function(){ 
     // bunch of code 
     async.forEach(self.someArr, self._newMethod, callback); 
    }; 

    self._newMethod = function(someObj, callback){ 
     self.somefunc(someObj.someProp, function(err, aNewObj) { 
      if (err) { 
       return callback(err); 
      } 
      self.someOtherArr.push(aNewObj.someOtherProp); 
      callback(); 
     }); 
    }; 
};