2014-01-18 7 views
5

Ich lerne Node.js und ich fange gerade an, mit einigen MySQL Verbindungen zu arbeiten. Ich habe eine Funktion, die eine Reihe von Zeilen aus der Datenbank bekommen soll, was sie richtig macht. Ich weiß jedoch nicht, wie ich diese Reihe von Zeilen später zurückgeben soll. Ich habe versucht, zwei Optionen (beide unten in den Kommentaren im Code-Segment erläutert.Wie man den Wert von der Node.js Funktion zurückgibt, die die DB Abfrage enthält

function fetchGameList(){ 
    var ret = 0; 

    connection.query("SELECT * from tbl", function(err, rows, fields) { 
     //some stuff happens here, and 'ret' is set to a vlue, for instance 
      //ret = 7; 
     //ret has the value 7 here, but if I put 'return ret' here, nothing is returned 
    }); 

    return ret; //returns 0 because Node is asynchronous and the query hasn't finished yet 
} 

Also, die Frage ist, wie kann ich den richtigen Wert von ret (7 in diesem Fall zurück)? Bin ich auch diese Strukturierung richtig ?

Antwort

10

Sie benötigen einen Rückruf in Ihrer Funktion zu übergeben. Konvention ist, dass der Rückruf ein Fehler auftritt (oder null wenn keine geschah) als erstes Argument und die Ergebnisse als andere Argumente.

function fetchGameList(callback) { 
    var ret; 

    connection.query("SELECT * from tbl", function(err, rows, fields) { 
     if (err) { 
      // You must `return` in this branch to avoid using callback twice. 
      return callback(err); 
     } 

     // Do something with `rows` and `fields` and assign a value to ret. 

     callback(null, ret); 
    }); 
} 

können Sie mach jetzt was g entlang der Linien von:

function handleResult(err, result) { 
    if (err) { 
     // Just an example. You may want to do something with the error. 
     console.error(err.stack || err.message); 

     // You should return in this branch, since there is no result to use 
     // later and that could cause an exception. 
     return; 
    } 

    // All your logic with the result. 
} 

fetchGameList(handleResult); 
+0

Sie werden schnell erkennen, dass dies nicht mehr handhabbar werden kann. Ich empfehle die [async] (https://npmjs.org/package/async) Bibliothek für die Behandlung langer Ketten von asynchronen Funktionen. – qubyte

+0

Ich bin besorgt, dass, wenn ich 5 Funktionen wie diese habe, ich jeden so nennen und so 5 "Schichten" von Funktionen sozusagen machen muss. Wie Sie gesagt haben, kann dies leicht unüberschaubar werden. Ich meine, ich kann es schreiben, aber viel Glück für jeden, der es später ändern will. Die "Async" -Bibliothek sieht genau so aus, wie ich sie brauche, auf den ersten Blick sieht es so aus, als würde ich in diesen Fällen die Flusssteuerung ".series" verwenden wollen. – jovan

+1

Sie sind genau richtig. 'async.series' ist die nützlichste Methode der Bibliothek. Versuchen Sie, "asyncwasserfall" zu vermeiden. Es sieht zunächst gut aus, macht aber später Modifikationen schwieriger. Versuchen Sie auch, Ihre Funktionen zu benennen, anstatt inline anonyme Funktionen zu schreiben. Dies verbessert die Lesbarkeit und stapelt Spuren, wenn etwas schief geht. – qubyte

Verwandte Themen