javascriptの非同期処理に関して質問があります。
node.jsにて簡単なDBからの参照処理を書いていて非同期処理で挙動が思う通りに行かずに混乱してます。
やりたい事は親テーブルのレコードセットに対して、子テーブルから該当するキーのサブレコードを取得しJSON形式で返却したいのですが、
テーブルJOINの一発で取得出来なく、親レコードをfetchしながら逐次処理を考えています。
外側のqueryを発行しcallback関数がコールされるところまではOKですが、内側のクエリー発行のcallbackが実行される前に
後続ステップが実行されてしまってます。
それに関しては現在promiseと格闘中です..(汗
そこで挙動的に解せないのが大きな下記処理ブロック
1.データ取得・編集処理
2.処理結果出力
のシーケンスが順次処理されている事です。
非同期からすると、1のデータ処理完了を待たなく2.のレスポンス処理が実行されそうですが、そこは順次実行されていそうです。。
レスポンス処理の記述はこれで正しいのでしょうか?
とんちんかんな質問かもしれませんが宜しくお願いします。
JS
1var express = require('express'); 2var app = express(); 3const db = require('mysql2'); 4const connection = db.createConnection({ 5 host : 'localhost', 6 user : 'hoge', 7 password : 'fuga', 8 database : 'hogedb' 9}); 10var data = []; 11 12app.get('/aaa/bbb', function (req, res) { 13 14 //1.データ取得・編集処理 15 connection.query("SELECT * FROM main_tbl", function(e1, r1, f1) { 16 17 data = r1; 18 for(i = 0 ; i < r1.length ; i++) { 19 20 console.log('info_1'); 21 22 connection.query("SELECT * FROM sub_tbl WHERE id = ?", r1[i].id, function(e2 , r2 ,f2) { 23 24 console.log('info_2'); 25 26 for(x = 0 ; x < r2.length ; x++) { 27 //サブテーブルを元に処理を行いdataの該当要素に追加する 28 } 29 }); 30 31 console.log('info_3'); 32 33 } 34 }); 35 36 //2.処理結果出力 37 res.set('application','json'); 38 res.set('Access-Control-Allow-Origin','*'); 39 res.set('Access-Control-Allow-Headers','Origin, X-Requested-With, Content-Type, Accept'); 40 res.send({'data': data, 'status': 'success'}); 41}); 42 43var server = app.listen(8080, function () { 44 var host = server.address().address; 45 var port = server.address().port; 46 console.log('listening at http://%s:%s', host, port); 47});
追記
初回のリクエストは正常なレスポンスデータではなかったです。
data変数のスコープがグローバルだったため、2回目以降は正常に動作している様に振舞っていただけでした。。(汗
失礼しました。
この様な処理の場合、処理の先行、後続関係をどの様に制御したらよいのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/13 14:03 編集
2017/09/13 14:42
2017/09/14 09:29