2016-06-14 7 views
3

で「child_added」イベントにリスニング:Firebase:初期の "child_added"呼び出しの後にコールバックを実行する方法は?

ref.on("child_added", function (snapshot) { 

}); 

このコールバック関数は、最初に参照に存在するすべての子供のために一度実行されます。

このイベントは、この場所の最初の子に対して1回トリガーされ、新しい子が追加されるたびに再度トリガーされます。

https://firebase.google.com/docs/reference/node/firebase.database.Reference

私が注文したのアレイ構築するために注文機能と一緒にこの事実を利用したい:しかし、(私の知る限り)方法はありません

orderedArray = []; 

ref.orderByValue("rating").on("child_added", function (snapshot) { 
    orderedArray.push(snapshot.val()) 
}); 

// how do I run a callback after the last child has been added? 

を最終的に私の配列に最後の子が追加された後に私自身のコールバックを正確に実行することはできません。

orderedArray = []; 

ref.orderByValue("rating").on("child_added", function (snapshot) { 
    orderedArray.push(snapshot.val()) 
}); 

setTimeout(function() { 

    ref.off("child_added") // unbind event 
    callback() 

}, 3000) 

これは特にそれがデータベースからすべてのデータを取得するために3秒以上かかるだろう場合には、かなり大ざっぱです:


はここで今、この権利に私の回避策です。

ここに任意のアイデアはありますか?一度データを読み取るためにref.off()を呼んでいるので、それは.once()方法および反復を使用するために理にかなって、

const ref = firebase.database().ref().child('items'); 
const items = []; 
ref.once('value', snap => { 
    snap.forEach(item => { items.push(item) }); 
    console.log(items); 
}); 

答えて

11

あなたは親スナップショットを反復処理し、DataSnapshot.forEachを使用して配列に子供を注文することができます代わりに親スナップショットの

+0

と 'forEach()'は、 'orderByValue()'のような順序付け関数を使ったとしても、それらを順番に読み込みますか? – octopod

+0

はもう少し詳しくドキュメントを読んでいます。ありがとう。 – octopod

+0

スナップに多数のアイテムがある場合はどうなりますか?このソリューションは、最初にメモリ内のすべてのアイテムを読み込んでコールバックに渡すように思えます。 – Ivan

関連する問題