2013-02-08 4 views
1

Я новичок в javascript/nodejs, и я работаю над некоторым кодом, пытаясь его очистить.Очистить код Javascript/Nodejs

Я использую библиотеку nodejs async, чтобы справиться с упрощением асинхронных частей кода.

Сейчас код выглядит следующим образом:

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'. –

+0

Я обновил свой вопрос, чтобы сделать его более понятным. Названная функция также использует self. –

ответ

2

Если эта функция не определена в том же замыканию, где сам существует, вы должны будете использовать что-то прокси-сервер к нему:

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

Это все о начале закрытия с помощью js. –

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(); 
     }); 
    }; 
}; 
Смежные вопросы