Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

189
Views
Firestore: escucha una lista infinita en Snapshot ()

Tengo una pantalla "Mis chats" con un componente "ChatList" en mi aplicación web.

Cada "ChatListItem" tiene el avatar del usuario, la fecha del último mensaje, el contenido del último mensaje (que se puede eliminar), etc.

Se representa así en mi base de datos

 ChatRoom doc = { lastMessage: { date, content, senderId }, members: {id1: { username, avatar }, id2: { username, avatar }}, membersIds: [id1, id2], read: false, }

Y almacenado en Firestore siguiendo esta estructura NoSQL:

 / chatsCollection/ chatDoc1 chatDoc2 ...

Así es como estoy escuchando todos los chats de los usuarios actuales:

 export function listenMyChats(limitToLast, onNext, onError) { const currentUserId = getCurrentUser().uid; const query = firestore .collection("chats") .where("membersIds", "array-contains", currentUserId) .orderBy("lastMessage.date", "asc"); return query.limitToLast(limitToLast).onSnapshot(onNext, onError); }

Si limito los resultados de escucha a 20, entonces no será posible manejar los cambios de, por ejemplo, el elemento 80 de mi ChatList.

Imagina que el otro usuario elimina el último mensaje que envió, actualizando los datos del documento de la sala de chat a:

 ChatRoom doc = { lastMessage: { date, <---- DATE HAS NOT CHANGED! deleted: true, <----- senderId }, members: {id1: { username, avatar }, id2: { username, avatar }}, membersIds: [id1, id2], read: false, }

Como puede ver, la fecha del último mensaje no ha cambiado, y estoy escuchando los 20 primeros elementos ordenados por la fecha del último mensaje.

Esto causará un problema. Si el documento está en la posición 21 de mi ChatList, no podré actualizar la GUI con los nuevos datos respectivos, ya que el oyente no detectará ningún cambio.

Pensé en combinar el oyente con un sistema de actualización dentro de la pantalla "Mis chats". Pero, ¿hay algún otro enfoque para manejar todos los elementos sin eliminar limitToLast(20) ?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

El problema probablemente es que está tratando de modelar sus datos de una manera diferente a cómo está diseñado Firestore.

está tratando documentos que llegan a través del oyente como eventos. Pero, de hecho, lo que debe hacer es crear una consulta que muestre exactamente qué datos desea ver en la interfaz de usuario, por ejemplo, los 20 chats más recientes que no se eliminaron.

El SDK de Firestore le informará cada vez que cambie el conjunto de documentos que coinciden con la consulta. Luego, debe actualizar la interfaz de usuario para que coincida con el nuevo conjunto de documentos en la lista de observación. Si se elimina un chat, el SDK de Firestore aún le avisará porque rastrea los documentos que desaparecen de los resultados de la consulta y los documentos que aparecen.

Otra opción, quizás más similar a lo que está haciendo ahora, sería tener eventos reales almacenados en una colección en alguna parte. Un evento de eliminación incluiría la marca de tiempo en la que se eliminó, por lo que puede estar seguro de que al mirar los documentos más recientes es probable que se incluyan los cambios que le interesan.

Para obtener más información relacionada con el "desplazamiento infinito de Firestore", puede consultar el caso y el documento de stackoverflow donde se menciona una breve descripción sobre el desplazamiento infinito y cómo puede hacerlo en su aplicación.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!