2016-04-16 17 views
0

Node.JSには、MySQLデータベースに接続し、一連の行を取得して配列として返す関数があります。私の問題はasynchronousコードです、私はasync Node.JSモジュールを使用しています。非同期コールバック関数の値を返すNode.JS関数

これは、これまでのところ、私の機能は次のとおりです。

var async = require("async") 
function get_all_channels_by_order(){ 
    async.waterfall([ 
     function(callback){ 
      mysql_connection.connect() 
      mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", function(err, result){ 
       callback(null, result) 
      }) 
     } 
    ], function(err, result){ 
     mysql_connection.end() 
     return result 
    }) 
    //return ?? somehow, return the value from the MySQL query? 
} 
console.log(get_all_channels_by_order()) 

ラインは機能が既にそれはまだ送信されていなかったにもかかわらず、戻り値をチェックするためにコールするときに問題が表示されます。

どうすればいいですか?それも可能ですか?私はこの機能を使うことができず、必要なときに手動でクエリを実行することができないことに気づきましたが、それは完全に組織化されずに乱雑に終わることになります。

私はこれまでに 'Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference'の複製としてマークされた 'Change a variable from outside it's scope'という質問をしましたが、非同期コードについての質問ではなく、関数から値を返す方法ではなく、

+0

あなたがに対処するためにget_all_channels_by_order'関数 'に' '(引数としての機能)コールバックを持っている必要があります' result' – Rayon

+1

有名DUP http://stackoverflow.com/questions/14220321/how-do-i -return-from-as-asynchronous-call – elclanrs

+0

_ドキュメントから、_それぞれの結果を配列の次のものに渡す一連の関数のタスク配列を実行します。ただし、いずれかのタスクが独自のコールバックにエラーを渡すと、次の関数は実行されず、メインコールバックがエラーとともにただちに呼び出されます。 __waterfall(タスク、[コールバック])__ – Rayon

答えて

1

これは非同期コードなのでデータを取得するためにコールバックを使用する必要があります。

あなたがasyncパッケージを使用すると、return resultが役立つと思いますか?

  • いいえ、できません。

非同期パッケージは、以前の関数の結果を使用する関数がたくさんあるときに、コールバックヘルを取り除くのに役立ちます。

あなたのケースでは、非同期は必要ありません。

nodejs非同期動作についてのチュートリアルを読んだり、ご覧になったりしてください。たとえば、このチュートリアルシリーズ:timeline 03:00 where explains blocking vs non-blocking code

だから、クエリの実行後にデータを取得するためには、これだけの方法です:

mysql_connection.connect(); 

function get_all_channels_by_order(callback){ 
    mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", callback); 
} 

get_all_channels_by_order(function(err, result) { 
    if(err) { 
    console.error(err); 
    return; 
    } 

    console.log(result); 
}); 
+0

これは完璧です(愚か者のために申し訳ありません、私は研究を行い、見て、私はその質問を見ませんでした 'http://stackoverflow.com/questions/14220321/how- do-i-return-as-as-asynchronous-call ') – ZeroByter

関連する問題