【问题标题】:Firestore document listener doesn't return current value from serverFirestore 文档侦听器不从服务器返回当前值
【发布时间】:2021-07-08 10:49:46
【问题描述】:

我正在尝试为 Firebase Firestore 使用文档快照侦听器。我想根据来自服务器的当前文档值执行一些操作,但还要监听文档的更改并在可能的情况下启用离线缓存。

侦听器会在文档更改时更新状态,但由于某种原因,它总是从以前的缓存中操作,以记录在侦听时更改的内容:

let unsub = firebase.firestore().collection('myCol').doc('myDoc').onSnapshot((doc) => {
    if(doc.data().myVal) myFunction(); //myVal is always what the last listener thought it was, not updated from current server value
}

因此,如果我随后调用 unsub() 并在控制台中更改文档,则下次启动侦听器时,它将返回上次侦听时的缓存值,而不是第一次加载来自服务器。

如何强制监听器从服务器而不是旧的本地缓存中获取第一个值?

【问题讨论】:

  • 你能试试.onSnapshot({ includeQueryMetadataChanges: true }, (doc) => {}),通过记录`snapshot.metadata.fromCache`来检查数据源是否缓存?
  • snapshot.metadata.fromCache 记录为 true,添加元数据更改似乎没有帮助
  • 你开启离线持久化了吗?
  • 是的,使用firebase.firestore().enablePersistence().catch((e) => {});
  • documentation 说,“如果你启用了离线持久化,当本地缓存的数据发生变化时,你的监听器会收到监听事件。”

标签: javascript firebase google-cloud-firestore


【解决方案1】:

目前我可以强制侦听器逻辑首先从服务器加载的唯一方法是首先手动触发文档上的 get()。这只会更新侦听器上次未侦听时发生的任何更改的本地缓存。

如果您的代码有类似问题,请在设置监听器逻辑之前添加:

await firebase.firestore().collection('myCol').doc('myDoc').get({source: 'server'}).catch(e => {});

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2012-11-05
    • 2020-01-07
    • 2013-08-07
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多