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 に答える