変更がローカルの場合、onSnapshotfromCacheは常にfalse

Aug 24 2020

説明によると、ここで私が期待するsnapshot.metadata.fromCacheことtrueに耳を傾けされた文書は、リスナー、例えば同じクライアントで変更されたとき

  1. ローカルは.update(...)すぐにonSnapshotハンドラーをトリガーします(そしてにfromCache設定されたスナップショットが渡されますtrue
  2. データはデータベースに送信されます
  3. onSnapshotサーバーデータがキャッシュと一致するため、Firebaseクライアントはリターンメッセージを受信し、何もしません(トリガーしません)。

エルゴ、onSnapshotがローカルの変更によってトリガーされたときにfromCache常に存在trueする必要があります。

ただし、これは最初の2〜3つのonSnapshot応答にのみ当てはまるようであり、その後fromCacheは常にそうであるように見えますfalse

テスト例:


// ... 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);

編集:ここでの質問は、この他の質問と同様に知識が不足しているためです:ローカルクライアントセットによるFirestore onSnapshot更新イベントですか?

回答

1 FrankvanPuffelen Aug 26 2020 at 03:45

エルゴ、fromCacheは、onSnapshotがローカルの変更によってトリガーされた場合、常にtrueである必要があります。

私はそれがどのように定義されているとは思いません。それは、クライアントがローカルスナップショットがサーバーに対して最新であるかどうかを知っているかどうかということです。

あなたは多分と混同fromCachehasPendingWritesます。fromCache名前は確かに混乱しています。fromCache「サーバーからのすべてのデータがまだ含まれていない可能性がある」と理解しisPendingていますが、「サーバーがまだ認識していないデータが含まれている可能性があります」です。