2016-10-13 1 views
1

Meine Anwendung ist ein einfacher mysql-Client, der über die Befehlszeile verwendet wird - er stellt eine Verbindung zur Datenbank her und führt wenige Abfragen aus, um Informationen aus der Datenbank abzurufen. Mysql Funktionalität ist in einer Klasse gekapselt und Problem ist, da Aufrufe an MySQL-Server async (verständlicherweise) ist - der Code-Flow erreicht das Ende der Anwendung.Umgehendes asynchrones Problem in der node.js-Anwendungsbefehlszeile

Und ich bin nicht in der Lage, auf "das" (Mysql) innerhalb einer Methode der Mysql-Klasse beziehen.

Wie kann ich dieses Problem umgehen?

Unten ist mein Code.

//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) { 
    //... 
}); 

Antwort

1

Jedes Mal, wenn Sie eine Callback-Funktion springen in Sie den Umfang des this Objekts zu verlieren. Es gibt verschiedene Möglichkeiten, um es zu umgehen.

Assign this auf eine andere Variable

Die erste Lösung ist, die this Objekt in eine andere Variable (z.B .: that, self) zuzuweisen. Wenn Sie einer anderen Variable eine Variable zuweisen und die erste Variable ein Objekt ist, behalten Sie den Verweis auf das ursprüngliche Objekt, und Sie können es innerhalb des Callbacks verwenden. So etwas ähnliches:

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

} 

Bind das this Objekt an die Funktion

können Sie binden das this Objekt an die Funktion und möchten, dass Sie das this Schlüsselwort auf den angegebenen Wert (in Ihrem Fall eingestellt der Umfang außerhalb von showTables Funktion). Sie können die Dokumentation von this lesen und Sie werden mehr verstehen können:

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

} 

Verwenden es6 arrow Funktionen

Es ist mehr oder weniger die gleiche Lösung wie die erste. Wenn Sie einen Transpiler verwenden, werden Sie feststellen, dass er wie die erste Lösung übersetzt wird:

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