¿Cómo se separa la carga de datos inicial de los elementos incrementales con Firebase?

Tengo una aplicación donde se agregan nuevos niños a Firebase cada 5 segundos más o menos. Tengo miles de niños.

En la carga de la aplicación, me gustaría procesar los miles iniciales de forma diferente a los hijos subsiguientes que se filtran cada 5 segundos.

Puede sugerir que use valor, procese todo y luego use children_added. Pero creo que si el procesamiento lleva demasiado tiempo, tengo el potencial de perder un punto.

¿Hay alguna forma de hacer esto en Firebase que garantice que no pierdo un punto?

Como los eventos child_added para los datos iniciales precargados se dispararán antes de que el evento de value se active en el elemento principal, puede usar el evento value como una especie de notificación de “datos cargados iniciales”. Aquí hay un código que modifiqué ligeramente de otra pregunta similar de StackOverflow .

 var initialDataLoaded = false; var ref = new Firebase('https://.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; }); 

Afortunadamente, Firebase guardará en caché de forma inteligente estos datos, lo que significa que la creación de un child_added tanto child_added como child_added solo descargará los datos una sola vez. Agregar nuevos detectores de Firebase para datos que ya han cruzado el cable es extremadamente económico y debería sentirse cómodo haciendo cosas así regularmente.

Si le preocupa descargar todos esos datos iniciales cuando en realidad no los necesita, seguiría las sugerencias de @ FrankvanPuffelen en los comentarios para usar una consulta con marcas de tiempo. Esto funciona muy bien y se optimiza utilizando consultas de Firebase.

Se mejoró la respuesta de @jacobawenger para no usar una variable de estado global

 var ref = new Firebase('https://.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 }); }); 

Hay dos posibles soluciones a este problema, que no satisfacen:

1) Marque la hora de sus hijos y solo solicite a los niños que tengan una marca de tiempo mayor que el valor “ahora”. Esto no es genial porque puede haber un problema de sincronicidad entre el “ahora” de su aplicación y el “ahora” en lo que sea que empuje los datos a Firebase o el valor del servidor de Firebase para “ahora”.

2) Usar valor y agregar niño. Cualquier duplicado visto en child_added que ya se haya visto en valor puede descartarse. ¡Esto no se puede usar para grandes conjuntos de datos, ya que requiere descargar todos los datos históricos DOS VECES!

¿Por qué no puede haber un comando como “child_added” que NO da todo para siempre?