2017-02-05 1 views
0

Ich muss eine Menge Daten vom Firebase lesen (~ 3000 Kinder und ~ 1,5 MB) und es wird gut sein, wenn ich etwas zeigen kann, das für den Benutzer heruntergeladen wird. Also beschließe ich, child_added zu verwenden, um jedes von ihnen zu zeigen, aber es funktioniert nicht, wie ich erwarte.Wie funktioniert firebase child_added wirklich?

Nach einigen Experimenten habe ich festgestellt, dass es beim ersten hinzugefügten Kind ~ 5 Sekunden dauert und einige Sekunden bis zum Ende (~ 3 Sekunden). Wenn ich value Ereignis verwende, dauert es ~ 5 Sekunden, um sie alle auch zu bekommen.

Also meine Frage ist, wie Firebase child_added wirklich funktioniert? Werden alle geladen und ein Ereignis ausgelöst oder habe ich etwas übersehen?

aktualisieren

Dies ist meine Datenbankstruktur.

- contacts 
    - nw7VoNBw0iLUkb 
    - city 
    - company 
    - email 
    - name 
    - gender 
    - BEu8Yd7ihgxbaF 
    ... 

und einige meiner Code

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('child_added', snapshot => { 
    console.log('add', Date.now()) 
}) 

und

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('value').then(snapshot => { 
    console.log('end', Date.now()) 
}) 
+0

Der Zugriff auf jeden Knoten braucht Zeit. Wenn Sie Ihre Daten von Kind zu Kind herunterladen, würde das viel länger dauern als das Herunterladen aller Daten. – ThunderStruct

+0

Ich stimme zu, aber was ist mit der ersten Ladung? Ich denke, es sollte schneller sein, als alle zu laden, oder? –

+0

Nun, es ist mehr über die Tiefe des Knotens. Wenn das erste abgerufene Kind tiefer verschachtelt ist, dauert es länger. Ich schlage vor, dass Sie die Datenbankstruktur zu Ihrer Frage hinzufügen. Leute können dir besser so helfen :-) – ThunderStruct

Antwort

1

auf ('child_added') hat kein Konzept von Finishing, wenn alle Daten geladen wird. Es ist immer warten auf ein neues Kind zu sehen, dass es nicht zuvor gesehen hat, bis Sie es ausschalten. Der Rückruf kann jederzeit ausgelöst werden. Eventuell werden möglicherweise zuerst Elemente aus einem lokalen Cache geladen, zusätzlich dazu, dass auf weitere Elemente gewartet wird, die auf dem Server angezeigt werden.

Wenn Sie einen einzelnen Schnappschuss alle die Daten an einem bestimmten Knoten benötigen, nur einmal, und Sie wollen nicht über zukünftige Änderungen benachrichtigt werden, nur once('value') verwenden.

Es ist eine gute Idee zu use the docs, um sich mit dem Unterschied zwischen on() und once() und den verschiedenen Arten von Ereignissen vertraut zu machen.

+1

In der Dokumentation: 'einmal entspricht Aufruf(), und dann off()', so denke ich, es gibt keinen Unterschied zwischen ihnen in Bezug auf die Ladegeschwindigkeit und ich habe kein Problem damit. Meine Frage bezieht sich auf 'child_added' und' value' Event, ich bin nur neugierig, warum die erste Ladezeit von 'child_added' und das Laden aller von ihnen mit' value' etwas gleich ist. Vielen Dank. –

+0

Sie könnten jedes Mal dieselben Daten aus dem Cache abrufen. Wenn Sie nicht viele Daten haben und einige nicht zwischengespeichert sind, denke ich nicht, dass eine Leistungsbeobachtung sehr aussagekräftig ist. Fordern Sie einfach die minimale Menge an Daten an, wenn Sie sie benötigen, und lassen Sie das SDK das tun, was für die Leistung am besten ist. –

Verwandte Themen