2016-10-13 6 views
1

私のアプリケーションは、コマンドラインから使用される単純なmysqlクライアントです。データベースに接続し、データベースから情報を取得するためのクエリをほとんど作成しません。 Mysqlの機能はクラスにカプセル化されており、mysqlサーバへの呼び出しは非同期(わかりやすく)なので、コードフローはアプリケーションの終わりに達します。node.jsアプリケーションコマンドラインでの非同期問題の回避方法

そして、私はMysqlクラスのメソッドの中で 'this'(Mysql)を参照することができません。

この問題を回避するにはどうすればよいですか?

以下は私のコードです。

//CLASS 
function Mysql(config) { 
    //... 
} 

//METHOD 
Mysql.prototype.getDbInfo = function (cbk) { 

    this.showTables(function(e,r) { 
    // >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<< 
    console.log(this.configVar); 
    }); 

} 

module.exports = Mysql; 

//CLASS OBJECT 
var test = new Mysql(config); 

//METHOD INVOKE 
test.getDbInfo(function (err,results) { 
    //... 
}); 

答えて

1

あなたはthisオブジェクトのスコープを失うされているコールバック関数にジャンプするたびに。それを回避するにはさまざまな方法があります。別の変数

に割り当てthis

第1の解決策は別の変数(例えば:thatself)にthisオブジェクトを割り当てることです。ある変数を別の変数に代入し、最初の変数がオブジェクトの場合は、元のオブジェクトへの参照を保持し、コールバック内でその変数を使用することができます。そのような何か:

Mysql.prototype.getDbInfo = function (cbk) { 
    var self = this; 
    self.showTables(function(e,r) { 
    // >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<< 
    console.log(self.configVar); 
    }); 

} 

バインド機能へthisオブジェクトが

あなたは関数にthisオブジェクトをバインドして、あなたの場合には(与えられた値に設定thisキーワードを設定することを好むことができます範囲外のshowTables機能)。あなたはthisのドキュメントを読むことができますし、より多くを理解することができるようになります。

Mysql.prototype.getDbInfo = function (cbk) { 
    this.showTables(function(e,r) { 
    // >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<< 
    console.log(self.configVar); 
    }.bind(this)); 

} 

使用ES6は、それは最初のもののような、多かれ少なかれ、同じ溶液である機能

矢印します。蒸散器を使用する場合、最初の解決策のように翻訳されていることがわかります。