Firebase V9 nedává chyba v chytit, když v režimu offline

0

Otázka

I want to set state in catch even if user offline but firebase V9 setDoc does not give anything in catch when user offline

Chci, aby stát, ve chytit, i když uživatel v režimu offline, ale firebase V9 setDoc nedává nic chytit, když uživatel je offline

Pro Příklad: v Ověřování, pokud je uživatel v režimu offline firebase dává (network error) v chytit, ale v firestore "přidat dokument" žádná zpráva z úlovku...

1

Nejlepší odpověď

2

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}`);
}
2021-11-23 12:54:38

Skvělá odpověď Sam!
Frank van Puffelen

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................