De forma predeterminada (al menos si está utilizando Expo), parece que si intenta .get() algo de Firestore sin conexión a Internet, los datos se devolverán desde el caché, incluso si la persistencia local no está implementada en el navegador.
Puede ver este comportamiento en Expo, con el sdk original de firebase, si ejecuta este método sin conexión:
async function performSomeQuery(query, limit) { const querySnapshot = await query.limit(limit).get(); if (querySnapshot.metadata.fromCache) { throw new Error("It is from cache!"); } if (querySnapshot.empty) { return []; } const result = querySnapshot.docs.map(parseDoc); return result; } Para mí, este comportamiento es un poco confuso... porque si intenta habilitar la persistencia local de Firestore en su aplicación Expo, obtendrá el código de error: unimplemented
firebase.firestore().enablePersistence() .catch((err) => { console.log(err.code); // unimplemented for Expo });¿Cómo puedo recibir excepciones en lugar de datos "en caché" cuando Internet no está conectado?
Primero, deberá instalar NetInfo desde @react-native-community/netinfo
Luego, copie esta función de orden superior (una utilidad):
import NetInfo from "@react-native-community/netinfo"; export default function withInternet(callback) { async function wrapped(...args) { const { isConnected, isInternetReachable } = await NetInfo.fetch(); if (isConnected === false || isInternetReachable === false) { throw new Error("No internet connection"); } return callback(...args); } const name = callback.displayName ?? callback.name ?? "unknown"; wrapped.displayName = `withInternet(${name})`; return wrapped; }; Como puede ver, estamos saliendo de la función envuelta sin ejecutar la devolución de llamada si no hay conexión a Internet o no se puede acceder a ella. (Nota: es importante verificar si === false , porque la API de NetInfo podría devolver un valor nulo/indefinido si se desconoce el estado de la red).
Ahora, en su código, en lugar de usar su método api original, simplemente haga lo siguiente:
const performSomeQueryWithInternet = withInternet(performSomeQuery); (async () => { try { await performSomeQueryWithInternet(stuff); } catch(err) { console.error(err); } })();Nota: recomiendo combinar esta solución con un proveedor de contexto global donde escuche el estado de la red y muestre los posibles errores en un componente de brindis.