node.jsでの非同期処理に関してどなたか教えてください。
今、firebaseのcloud functionに関してnode.jsを利用して
以下のような処理を実装しようとしています。
受け取った配列(下記 変数名:input)の要素を検索条件(完全一致)としてfirebaseにあるデータベースにアクセスし
取得結果をメールで送信しようとしてます。(配列の要素数分クエリを発行)
すべての検索処理が完了してメールを送信したいので検索処理部分につき同期処理にするためasync.jsを導入しました。
当初async.series,async.waterfall,で行っていましたが
繰り返し処理内にコールバック関数が存在することに気づき
async.eachを使用しました。
ところがasync.eachの第3引数のコールバック関数(最終的にはこの部分でメールを送ろうとしています)
が実行されずログが出力されてない(1:異常終了/2:すべて正常終了のいづれも)状況です。
callback();を実行すべき場所に誤りはないようですが意図した動きになっていません。
ソースは以下のように記述しています。
var admin = require('firebase-admin'); var input = ['a','b','c']; async.each(input, function(data, callback){ var ref = admin.database().ref("table_name"); // 'a','b','c'に一致するものを検索 var result = ref.orderByChild("target_column").equalTo(data).once('value').then(function(snapshot) { var items = snapshot.val(); console.log(items); callback(); }) }, function(error) { if(error){ console.error('1:異常終了'); } else { console.log('2:すべて正常終了'); } });
6行目を以下のように変更しても結果は同じでした。
var result = ref.orderByChild("target_column").equalTo(data).once("value", function(snapshot) {...});
そこで
- まずは原因と対応方法についてお気づきの方がいらしたら教えてください。
- このようにループ内でコールバック関数が実行され非同期となるのようなケースで、
同期的に実行する良い方法がありましたら教えてください(async.jsに拘ってはいません。)
- さらにループ内にループがあるような場合も想定して、ベストな方法がありましたら教えて頂けないでしょうか(最近のトレンドも加味して)
尚、それぞれのバージョンは以下となります。
(package.jsonより抜粋)
"async": "^2.5.0",
"firebase": "^4.1.3",
"firebase-admin": "~4.2.1",
"firebase-functions": "^0.5.7"
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。