質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

2718閲覧

Firebaseのdatabase での検索処理時の同期処理に関して(async.jsを利用)

allazward

総合スコア11

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2017/07/24 06:35

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

そこで

  1. まずは原因と対応方法についてお気づきの方がいらしたら教えてください。
  2. このようにループ内でコールバック関数が実行され非同期となるのようなケースで、

同期的に実行する良い方法がありましたら教えてください(async.jsに拘ってはいません。)

  1. さらにループ内にループがあるような場合も想定して、ベストな方法がありましたら教えて頂けないでしょうか(最近のトレンドも加味して)

尚、それぞれのバージョンは以下となります。
(package.jsonより抜粋)
"async": "^2.5.0",
"firebase": "^4.1.3",
"firebase-admin": "~4.2.1",
"firebase-functions": "^0.5.7"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

asyncやqに頼ろうとしたのですが
それはpromiseの仕様の理解があやふやだったせいで
今回良い機会だと思いpromiseに関して調べなおしました。
その過程で以下のページを拝見することになり、
また他のサイトでpromise.allですべての完了を待たなければ
期待した処理が行われないことに気づき
最終的にpromise.allによる実装で解決しました。
お騒がせして申し訳ありません。

Receive data synchronously in Firebase

投稿2017/07/25 06:46

allazward

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問