清理Javascript / Nodejs代码

时间:2013-02-08 23:43:26

标签: javascript node.js asynchronous coding-style

我是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();
  });
}

但由于背景变化,这显然不起作用。

2 个答案:

答案 0 :(得分:2)

除非在自身存在的同一个闭包中定义了该函数,否则你需要使用一些东西代理它:

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

答案 1 :(得分: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();
        });
    };
};