Je to tím, že design, díky Firestore je Offline Chování (ve frontě na správné místo, ale já doporučuji sledovat v plné výši).
Slib, který vyřeší jednou serveru uznal žádost. Pokud server je momentálně nedostupný, že žádost je v mezipaměti v rámci SDK a pokusil jakmile připojení je obnovena. Během této okna, Slib bude dodržen v jeho čekající státu, protože stát je vlastně v - čekající. Zatímco slib nemusí vyřešit všechny vaše místní v reálném čase posluchačů, a tak bude stále střílet, a vaše aplikace bude fungovat jako normální - jen offline.
Řešení tohoto chování je cvičení pro vývojáře. Jeden způsob by bylo použít Promise.race()
realizovat svůj vlastní offline-zpracování logiky.
Jako rychlé a špinavé příklad, tady je setDocWithTimeout
provádění:
const setDocWithTimeout = (ref, data, options) => {
const timeoutMS = options && options.timeout || 10000;
const setDocPromise = setDoc(ref, data);
return Promise.race([
setDocPromise.then(() => ({ timeout: false })),
new Promise((resolve, reject) => setTimeout(resolve, timeoutMS, { timeout: true, promise: setDocPromise }));
]);
}
které můžete použít pomocí:
try {
const result = await setDocWithTimeout(doc(db, "cities", "new-city-2"), data);
if (result.timeout) {
// offline? (could be poor connection too)
console.log("Document added to Firestore queue");
// dismiss any blocking UIs/loading bubbles
// tell user will be written to server later
await result.promise; // wait for write to complete as before
}
// online! (or back online)
console.log("Document written successfully!");
} catch (err) {
console.error(`error found! ${err}`);
}
Případně, kde je chyba, je vyvolána:
const setDocWithTimeoutError = (ref, data, options) => {
const timeoutMS = options && options.timeout || 10000;
const setDocPromise = setDoc(ref, data);
return Promise.race([
setDocPromise,
new Promise((_, reject) => setTimeout(reject, timeoutMS, new Error("timeout"));
]);
}
které můžete použít pomocí:
try {
await setDocWithTimeoutError(doc(db, "cities", "new-city-2"), data);
console.log("Document written successfully!");
} catch (err) {
console.error(`error found! ${err}`);
}