2016-06-17 4 views
-1

NodeJS postgresqlクライアントを使用してデータループをフェッチして出力します。私はExpressJSをpostgresqlクライアントと一緒に使用しています。NodeJs関数の変数にアクセスすることができません

これは私がこのコードを実行するときしかし、私は適切な出力を得ることはありません私のコード

var main_data = some array of data 
    var user_info = {} 
    for (var key in result.rows) { 
     var user = main_data[key].user 

     client.query('SELECT name,age,address FROM users WHERE user_id = $1 LIMIT 1;' , [user], function(queryErr, result){ 
     var return_data = result.rows[0] 
     user_info.name = return_data.name 
     user_info.gender = return_data.gender 
     user_info.address = return_data.address 
     main_data[key].user_info = user_info 
    }) 
    } 

    done() 
    res.json(main_data) 
    return 

です。 userinfoはmain_dataにプッシュされません。 main_data変数はコードの始めと同じように出力されます。関数は、関数が実行されたら、私はちょうど、応答電話をかけることができないforループ内で座っているので 重複提案されているよう

は、それは簡単ではありません。私はループ全体が終了するまで待つ必要があります。ループが終了するまでに1000回以上かかることがあります。

私はそれを達成する方法を教えてください。 私は間違って何をしていますか、どうやって解決できますか? ありがとうございました

+2

可能な重複http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) – undefined

+0

しかし、問題は関数がループ内にあり、関数内のデータを返すことができないということです。ループが終わるまで私は待っている。したがって、client.query呼び出しの中で応答を作成するのは簡単ではありません。 – rksh

+0

nodejs postgresドライバのドキュメントをチェックアウトする必要があります。データがあるコールバック関数が非同期的に発生するため、res.jsonコールはまだ更新されていない情報を送信しています。 – Paul

答えて

1

私はこのためにasync.jsを使用します。

var rows = // your result.rows stuff. 

function doTheQuery(item, callback){ 
    // your query logic here, calling the callback with the results 
} 

async.series(rows, doTheQuery, function(err){ 
    // handle any errors 
} 
[私は非同期呼び出しからの応答を返すにはどうしますか?](の
+0

また、約束を使用することもできます。この場合、 'user_info'で解決し、' .all(約束) 'を使う約束の配列を作ることができます(例えば[RSVP.all()](https://www.npmjs.com/package/rsvp #arrays-of-promises))を呼び出して、それらをすべてシリアルに呼び出します。 – Squirrel

+0

私は実際に約束のファンではなく、正しく設計されたコールバックよりも優れたものを解決していないように感じます。 – Paul

関連する問題