2011-07-23 4 views
0

ノードプロジェクトでnow.jsとMongooseを使用していますが、mongoose関数内でthis.nowオブジェクトにアクセスできません。例えば。JavaScript(node.js)変数は、内部関数呼び出しでアクセスできません。 now.js

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); //this will work 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     this.now.talk(); // this will not work "TypeError: Cannot call method 'bark' of undefined" 
    }; 
    }); 
}; 

答えて

4

変更し、これにコード:あなたの内部の関数の内部

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    var that = this; // save 'this' to something else so it will be available when 'this' has been changed 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     that.now.talk(); // use local variable 'that' which hasn't been changed 
    }; 
    }); 
}; 

thisはおそらく何か他に設定されています。したがって、アクセスする値を保持するには、それを内部関数で使用できる別のローカル変数に割り当てます。

+0

えーえ華麗なthatsのすべてに約ある「という」何をしたい値にthisの値を設定します。 –

1
everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    Project.findOne({'_id':project_id}, (function(tunnel, err, project){ 
    if(project){ 
     this.now.talk(); 
    }; 
    }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this` 
}; 

使用Function.prototype.bindあなたは

+0

は、jfriend00が示唆しているように、 'that'を使用するよりもこのより良いスタイルですか? –

+0

@beck私はそれを個人的な好みと呼ぶでしょう。 '.bind'を使って余分なパラメータをトンネルすることもできます。 (編集を参照) – Raynos

関連する問題