2014-01-18 17 views
5

私はNode.jsを学んでいます。私はいくつかのMySQL接続で作業し始めています。私はデータベースから行のセットを取得するはずの関数を持っていますが、これは正しく機能します。しかし、後でその行を返す方法はわかりません。私は、両方のは、以下のコードセグメント内のコメントで説明した(二つのオプションを試してみました。DBクエリを含むNode.js関数から値を返す方法

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 
} 

だから、質問は、どのように私はこのケースでret(7)の正しい値を返すのですか?私もこれを適切に構築アム?

答えて

10

あなたの関数にコールバックを渡す必要があります。条約は、コールバックがエラーになります(または何も起こらなかった場合null)最初の引数として、および他の引数として結果ということである。

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); 
    }); 
} 

することができます今何かするgの行に沿って:

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

あなたはすぐにこれが管理できなくなることがわかります。非同期関数の長い連鎖を処理するには、[async](https://npmjs.org/package/async)ライブラリをお勧めします。 – qubyte

+0

私はこのような5つの関数があるとき、私はこのようにそれぞれを呼び出して、5つの「レイヤー」関数を作成する必要があることを心配しています。あなたが言ったように、これは簡単に扱いにくくなる可能性があります。私はそれを書くことができますが、後でそれを修正しようとする人には幸運をもたらします。 "非同期"ライブラリは私が必要とするもののように見えます。一見すると、これらの場合に '.series'フローコントロールを使いたいと思うようです。 – jovan

+1

あなたにスポットがあります。 'async.series'はライブラリのもっとも有用なメソッドです。 'async.waterfall'を避けてください。最初はうまく見えますが、あとで修正するのが難しくなります。インラインの匿名関数を記述するのではなく、関数にも名前を付けるようにしてください。これにより、読みやすさが向上し、問題が発生したときにトレースがスタックされます。 – qubyte

関連する問題