1

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

但这显然行不通,因为上下文发生了变化。

4

2 回答 2

2

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

async.forEach(self.someArr, function(someObj, callback){
   self.somefunc(someObj.someProp, function(err, aNewObj) {
       self.otherfunc(err, aNewObj, callback);
   });
 }, callback);
于 2013-02-08T23:56:45.570 回答
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();
        });
    };
};
于 2013-02-09T01:23:49.223 回答