onSnapshot fromCache sempre false quando la modifica è locale

Aug 24 2020

Secondo la descrizione qui, mi aspetto snapshot.metadata.fromCachedi essere truequando il documento ascoltato viene modificato nello stesso client dell'ascoltatore, ad es.

  1. Il locale .update(...)attiva immediatamente il onSnapshotgestore (e viene consegnato uno snapshot con fromCacheimpostato su true)
  2. I dati vengono inviati al db
  3. Il client Firebase riceve il messaggio di ritorno e non fa nulla (non attiva a onSnapshot) perché i dati del server concordano con la cache.

Ergo, fromCachedovrebbe sempre essere truequando onSnapshot viene attivato da una modifica locale.

Tuttavia, questo sembra essere il caso solo per le prime due o tre risposte su Snapshot, dopodiché fromCachesembra essere sempre false.

Test di esempio:


// ... firestore init w/ a test project and with persistence enabled. 

const db = firebase.firestore();
db.settings({
    ignoreUndefinedProperties:true
})

// Where "_test" is an empty collection with full allowance for read/write
await db.collection("_test").doc("deleteme").set({}); 

let doc = db.collection("_test").doc("deleteme") 

// ?! Expect this to be true but after the first one or two occurrences it is always false.
doc.onSnapshot(s=>{console.log("test snapshot change from cache? ",s.metadata.fromCache)}) 

let x = 0;      
let poke = async ()=>{
  doc.update({
    n:Math.random()
  })
  await sleep(3000); // generic custom delay 
  window.requestAnimationFrame(poke)
};
window.requestAnimationFrame(poke);

Modifica : la domanda qui è dovuta alla mancanza di conoscenze analoghe a quella dell'altra domanda: l' evento di aggiornamento Firestore onSnapshot è dovuto al set di client locale?

Risposte

1 FrankvanPuffelen Aug 26 2020 at 03:45

Ergo, fromCache dovrebbe sempre essere vero quando onSnapshot viene attivato da una modifica locale.

Non credo che sia così che sia definito; è più che altro se il client sa se la sua istantanea locale è aggiornata con il server.

Forse stai confondendo fromCachecon hasPendingWrites. Il fromCachenome è davvero confuso. Capisco fromCacheche "potrebbe non contenere ancora tutti i dati del server", mentre isPendingè "potrebbe contenere dati di cui il server non è ancora a conoscenza".