2015-01-16 10 views
30

Ich habe eine Anwendung, wo neue Kinder Firebase alle 5 Sekunden oder so hinzugefügt werden. Ich habe Tausende von Kindern.Wie kann die anfängliche Datenladung von inkrementellen untergeordneten Elementen mit Firebase getrennt werden?

Auf Anwendung laden möchte ich die ersten Tausende anders als die nachfolgenden Kinder, die alle 5 Sekunden tröpfeln.

Sie können vorschlagen, dass ich Wert verwende, alles verarbeiten und dann children_added verwenden. Aber ich glaube, wenn die Verarbeitung zu lange dauert, habe ich das Potenzial, einen Punkt zu verpassen.

Gibt es eine Möglichkeit, dies in Firebase zu tun, die garantiert, dass ich keinen Punkt verpasse?

+1

Variable verwenden Wenn Sie einen Zeitstempel für die Kinder mit 'Firebase.ServerValue.TIMESTAMP' hinzufügen, wird dies mit' startAt' trivial sein. Hast du schon etwas probiert? Wenn ja, können Sie den Code teilen und wo (fürchten Sie) schlägt es fehl? –

+1

mögliches Duplikat von [Wie man Anfangsdaten in einer Firebase DB verwerfen] (http://stackoverflow.com/questions/19883736/how-to-discard-initial-data-in-a-firebase-db) – Kato

+1

Siehe auch: [Wie nur neue Daten abgerufen werden] (http://stackoverflow.com/questions/18270995/how-to-retreive-only-new-data) – Kato

Antwort

56

Seit child_added Ereignisse für die Anfangs wird vorbelastet Daten Feuer vor die value Ereignis ausgelöst wird auf der übergeordneten, können Sie die value Ereignis als eine Art „Anfangsdaten geladen“ Benachrichtigung verwenden können. Hier ist ein Code, den ich leicht von another similar StackOverflow question geändert habe.

var initialDataLoaded = false; 
var ref = new Firebase('https://<your-Firebase>.firebaseio.com'); 

ref.on('child_added', function(snapshot) { 
    if (initialDataLoaded) { 
    var msg = snapshot.val().msg; 
    // do something here 
    } else { 
    // we are ignoring this child since it is pre-existing data 
    } 
}); 

ref.once('value', function(snapshot) { 
    initialDataLoaded = true; 
}); 

Zum Glück Firebase wird diese Daten intelligent cachen, was bedeutet, dass die Schaffung sowohl ein child_added und ein value Zuhörer nur die Daten einmal herunterladen. Das Hinzufügen neuer Firebase-Listener für Daten, die bereits über die Leitung gegangen sind, ist extrem günstig und Sie sollten sich regelmäßig so fühlen.

Wenn Sie sich Sorgen um all die anfänglichen Herunterladen von Daten, wenn Sie nicht wirklich brauchen es, würde ich folgt @ FrankvanPuffelen Vorschläge in den Kommentaren eine timestamped Abfrage zu verwenden. Dies funktioniert sehr gut und wird mithilfe von Firebase-Abfragen optimiert.

+1

Dies ist eine ausgezeichnete Antwort. Ich wusste nichts von dem cleveren Caching und habe das nirgendwo anders gesehen. Danke Jacob. Ich habe zwei Fragen: was passiert, wenn dieser Rückruf von Wert nicht sofort auftritt oder wenn der Rückruf selbst lange dauert (wegen Datenverarbeitung oder etwas anderes)? Besteht nicht die Möglichkeit, dass in dieser Zeit ein Kind hinzugefügt werden könnte? –

+2

Firebase sollte garantieren, dass das 'value' Ereignis ausgelöst wird, bevor irgendwelche * new *' child_added' Ereignisse ausgelöst werden, also sollte es dir dort gut gehen. Was die Datenverarbeitung des Callbacks betrifft, sollte dies nicht von Bedeutung sein, solange Sie die Variable initialDataLoaded sofort überprüfen. Wenn Sie es später im Callback nach einer Menge Blocking-Code überprüfen, hat es sich möglicherweise auf "true" geändert, und Sie glauben, dass Sie damit rechnen. Sie sollten den üblichen JavaScript-Best Practices folgen, da dies keine Firebase-spezifische Frage ist. – jwngr

+0

@jacobawenger Ich lese weiter, dass es "von Entwurf" ist, dass Firebase keinen Weg hat, die Anfangsdaten zu erfassen und dann nur zu greifen, was sich geändert hat? Ist das so, weil die 3-Wege-Datenbindung die Echtzeit-Synchronisation bereits verwalten soll? Ich mache mir nur Sorgen, dass ich versuche, Dinge manuell zu synchronisieren, wenn Firebase erstellt wird, um das zu deklarieren. –

-2

Es gibt zwei mögliche Lösungen für dieses Problem, weder befriedigend:

1) Zeitstempel Ihre Kinder und nur Anfrage Kinder, die einen Zeitstempel größer als ein „jetzt“ Wert haben. Das ist nicht gut, weil Sie möglicherweise ein Synchronizitätsproblem zwischen dem "Jetzt" Ihrer Anwendung und dem "Jetzt" haben, egal was die Daten an Firebase oder den Firebase-Serverwert für "jetzt" überträgt.

2) Verwenden Sie Wert und Kind hinzugefügt. Alle Duplikate in child_added, die bereits im Wert gesehen wurden, können verworfen werden. Dies ist bei großen Datensätzen nicht sinnvoll, da alle historischen Daten doppelt heruntergeladen werden müssen.

Warum kann es keinen Befehl wie "child_added" geben, der NICHT alles gibt?

+1

Bitte poste das nicht als Antwort, außer du denkst es ist eine Antwort.Kato gab zwei Links zu ähnlichen Fragen. Wenn die dort angegebenen Antworten nicht für Sie funktionieren, bearbeiten Sie Ihre Frage (es gibt einen praktischen Bearbeitungslink direkt darunter), um ein minimales Codebeispiel einzubinden, das zeigt, was Sie getan haben, und zu beschreiben, was damit falsch läuft. –

+0

Ich habe meine Takeaways von den zwei Links, die Kato gab, zusammengefasst und als Antwort gepostet. Außerdem: eine der Lösungen, mit denen verknüpft ist, hat genau das Problem, das ich vermeiden möchte: fehlende Daten für große Datenmengen. Ich poste das Problem in diesem Thread (http://stackoverflow.com/questions/19883736/how-to-discard-initial-data-in-a-firebase-db) –

+0

Eigentlich darf ich nicht kommentieren weil ich unter 50 Karma bin. Abgesehen von dem Problem, die Daten zweimal herunterladen zu müssen, besteht das Problem darin, dass bei großen Datensätzen eine zeitliche Lücke zwischen dem Ende von child_added und dem Ende des Werts besteht. Da hinzugefügte Kinder erst NACH dem Wert verarbeitet werden, könnten Sie Daten vermissen. –

-1

die Antwort von @jacobawenger Verbesserte keinen globalen Zustand

var ref = new Firebase('https://<your-Firebase>.firebaseio.com'); 

ref.once('value', function(snapshot) { 
    // do something here with initial value 

    ref.on('child_added', function(snapshot) { 
    // do something here with added childs 
    }); 

}); 
+0

Führt dies nicht zu einer Wettlaufsituation? Was ist, wenn während der Ausführung ein Kind hinzugefügt wird: // Etwas mit dem Anfangswert tun –

+0

Es sieht aus wie etwas, das ich versuche, aber ich erhalte doppelte Daten. Ich denke der Grund ist, dass child_added ALLE Daten hinzufügt, sogar von Anfang an - das ist genau so, wie es zu funktionieren scheint. Also brauchen wir eine Überprüfung wie in http://stackoverflow.com/a/27995609/129202, so dass wir keine doppelten Daten hinzufügen. – Jonny