Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

114
Visualizações
¿Cómo puedo cargar instantáneamente todas mis entradas de Firebase sin volver a renderizarlas?

Circunstancias: para mi proyecto de aplicación que usa una base de datos en tiempo real, intento cargar datos de todas las máquinas asociadas con el usuario. Las máquinas que debe ver el usuario dependen de la empresa relacionada (cid) y qué máquinas pertenecen a esa empresa.

Problema: he usado los documentos de Firebase v9 tanto como ha sido posible y he creado el código que puedes ver a continuación. Sin embargo, este código solo devuelve las máquinas correctas después de 3 renderizaciones. Parece que cada comando onValue solo devuelve algo después de volver a renderizar. ¿Puede alguien explicarme una forma en que puedo obtener los datos completos sin volver a renderizar la pantalla a la fuerza? Ya intenté usar el comando get de forma asíncrona, pero esto no pareció cambiar nada.

Imagen de diseño de Firebase

 useEffect(() => { const auth = getAuth(); const db = getDatabase(); const userRef = ref(db, "users/" + auth.currentUser.uid + "/cid"); onValue(userRef, (snapshot) => { const cid = snapshot.val(); setCid(cid, true); }); const machinesRef = ref(db, "companies/" + cid + "/machines"); onValue(machinesRef, (snapshot) => { const fetchedData = []; snapshot.forEach((childSnapshot) => { const childKey = childSnapshot.key; const childData = childSnapshot.val(); const parsRef = ref(db, "machines/" + childKey); onValue(parsRef, (snapshot) => { const parData = snapshot.val(); fetchedData.push( new Machine( childKey, cid, childData.type, childData.creation, parData.temperature ) ); }); }); setData(fetchedData); }); console.log(cid); # Outputted in the results section console.log(data); # Outputted in the results section }, []);

Resultados:
renderizar 1:

 null Array []

renderizar 2:

 cid # This is correct Array []

renderizar 3:

 cid Array [ Machine { "companyId": "cid", "creation": "creation", "id": "23rff3345GRR", "temperature": 99, "type": "type", }, Machine { "companyId": "cid", "creation": "creation", "id": "3454egGR3", "temperature": 2, "type": "type", }, ]
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Deberá mover la llamada a setData al controlador onValue :

 onValue(machinesRef, (snapshot) => { const fetchedData = []; snapshot.forEach((childSnapshot) => { const childKey = childSnapshot.key; const childData = childSnapshot.val(); const parsRef = ref(db, "machines/" + childKey); onValue(parsRef, (snapshot) => { const parData = snapshot.val(); fetchedData.push( new Machine( childKey, cid, childData.type, childData.creation, parData.temperature ) ); setData(fetchedData); // 👈 }); });

Si lo deja fuera de las devoluciones de llamada, se ejecutará antes de que se llame a fetchedData.push(...) . La forma más fácil de verificar esto es estableciendo puntos de interrupción en ambas líneas y ejecutándolos en un depurador, o agregando algo de registro y verificando el orden de la salida.

Para obtener una explicación más detallada sobre esto, consulte: ¿Por qué Firebase pierde la referencia fuera de la función once ()? (anterior a v9, pero el comportamiento es exactamente el mismo independientemente de la versión)

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda