2016-11-23 2 views
2

Ich habe einen großen Datensatz (~ 100k Einträge), die mit dem 'Child_Added' Ereignis abonniert wird. Mit knoten 7 und Firebase 3.6.1 scheint dies die gesamten 100k Einträge herunterzuladen, bevor ein einzelnes child_added Ereignis ausgelöst wird.Child_added Abonnement scheint gesamten Datensatz herunterladen

Der Speicherverbrauch nimmt für einige Dutzend Sekunden deutlich zu, und dann werden alle child_added-Ereignisse schnell hintereinander ausgelöst. Diese

ist langsam:

require('firebase'). 
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). 
database().ref('data'). 
on('child_added', (snap) => console.log(snap.key)); 

Begrenzung noch schnell (wenige Sekunden Verzögerung) ist:

require('firebase'). 
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). 
database().ref('data').limitToFirst(10). 
on('child_added', (snap) => console.log(snap.key)); 

In Anbetracht der Natur der Streaming von Firebase, ich nehme an, es nicht Verhalten für child_added Abonnements beabsichtigt ist, Laden Sie den gesamten Datensatz auf den Client herunter, bevor etwas erledigt ist.

Mache ich etwas falsch, oder ist das ein Fehler?

Antwort

1

Obwohl die in den child_added Abschnitt extrahierte aus firebase documentation heißt es:

Die child_added Ereignis normalerweise verwendet wird, wenn eine Liste von Elementen aus der Datenbank abgerufen werden. Im Gegensatz zum Wert, der den gesamten Inhalt des Speicherorts zurückgibt, wird child_added einmal für jedes vorhandene Kind und dann jedes Mal erneut ausgelöst, wenn dem angegebenen Pfad ein neues Kind hinzugefügt wird. Dem Ereignisrückruf wird ein Snapshot mit den Daten des neuen Kindes übergeben. Zu Bestellzwecken wird auch ein zweites Argument übergeben, das den Schlüssel des vorherigen Kindes enthält.

At the first lines in dieser Seite, können wir dies gefunden:

Daten in einer Datenbank Firebase Realtime gespeichert werden abgerufen durch einen asynchronen Zuhörer auf eine Datenbank Bezug zu befestigen. Der Listener wird einmal für den Anfangszustand der Daten und immer dann, wenn sich die Daten ändern, ausgelöst.

Scheint, sein normales Verhalten zu sein. Es ruft zuerst alle Daten ab.

+0

Dies erklärt nicht, warum der gesamte Datensatz zuerst heruntergeladen wird, bevor eines der child_added-Ereignisse ausgelöst wird. Das erwartete Verhalten besteht darin, dass diese Ereignisse ausgelöst werden, wenn die Einträge heruntergeladen werden, oder zumindest in kleineren Batches. Ich habe die Codebeispiele geändert, danke, dass Sie mich wissen lassen. – tjclement

+0

Ok, ich aktualisiere meine Antwort ... – Anfuca

+2

Das widerspricht dem, wofür Firebase entwickelt wurde (streaming in data), also fällt es mir schwer zu akzeptieren, dass dies wirklich beabsichtigt ist. – tjclement

0

Ich bin in der gleichen Situation und warte fast 40 Sekunden für das erste Kind zu feuern. Die einzige Lösung, die ich mir vorstellen konnte, war, die Schlüssel mit der Firebase Rest-API und den flachen Abfrageparametern zu erhalten, dann die einzelnen Schlüssel zu durchlaufen und Firebase aufzurufen. Hier ist im Grunde, was ich getan habe.

` 
    console.log('start', Date.now()); 
    fetch('https://[firebase_app].firebaseio.com/[your_path].json?shallow=true') 
    .then((response) => { 
     return response.json(); 
    }).then(function(j) { 
     Object.keys(j).forEach(function (key) { 
       console.log(key, 'start', Date.now()); 
       firebase_reference.child(key).on("child_added", function (snapshot) { 
        console.log(key, Date.now()); 
        //now you have the first response without waiting for everything. 
       }); 
     }); 
    });` 

Ich weiß, dass dies nicht Ihre Frage zu child_added Funktionalität nicht beantworten, aber es tut, was Sie mit child_added passieren würde erwarten. Ich werde eine Feature-Anfrage an Firebase senden und diese SO-Frage verknüpfen.

Verwandte Themen