2016-06-14 2 views
3

Wenn auf dem „child_added“ Ereignis wartet mit:Firebase: Wie führe ich einen Rückruf nach all den anfänglichen "child_added" -Aufrufen aus?

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

}); 

wird diese Callback-Funktion für jedes Kind zunächst einmal ausgeführt, die in der Referenz vorhanden ist.

Dieses Ereignis wird einmal für jedes anfängliche Kind an diesem Ort ausgelöst und jedes Mal, wenn ein neues Kind hinzugefügt wird, wird es erneut ausgelöst.

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

I Vorteil dieser Tatsache nehmen wollen zusammen mit den Bestellfunktionen, um eine geordnete Anordnung zu konstruieren:

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? 

Allerdings gibt es keine Möglichkeit, (meines Wissens) um das letzte Mal zu sagen, dass der Rückruf child_added aufgerufen wurde, kann ich meinen eigenen Rückruf nicht korrekt ausführen, nachdem das letzte Kind zu meinem Array hinzugefügt wurde.


Hier ist meine Abhilfe jetzt zu diesem Recht:

orderedArray = []; 

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

setTimeout(function() { 

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

}, 3000) 

Das ist ziemlich lückenhaft, vor allem in dem Fall, dass es wird mehr als 3 Sekunden dauern, bis alle Daten aus der Datenbank zu erhalten.

Irgendwelche Ideen hier?

Antwort

11

Sie können über übergeordnete Snapshot durchlaufen und die Kinder in ein Array bestellen DataSnapshot.forEach mit:

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

Da Sie ref.off() sind Aufruf einmal die Daten zu lesen, macht es Sinn, dass die .once() Methode und Iterierte zu verwenden des übergeordneten Snapshots stattdessen.

+0

und 'forEach()' wird sie in der Reihenfolge lesen, auch wenn ich eine Ordnungsfunktion wie 'orderByValue()' verwendet? – octopod

+0

Lesen in die Dokumentation ein bisschen mehr, tut es! Vielen Dank. – octopod

+0

Wie sieht es mit Fällen aus, wenn eine große Anzahl von Objekten im Snap ist? Es klingt, als ob diese Lösung zuerst alle Elemente in den Speicher lädt und sie dann dem Rückruf zurückgibt. – Ivan

Verwandte Themen