Cloud Firestore onSnapshot() 能否仅在更改时触发,而无法获取初始状态?

Tho*_*hoe 13 firebase google-cloud-firestore

文件说:

您可以使用 onSnapshot() 方法收听文档。使用您提供的回调的初始调用会立即使用单个文档的当前内容创建文档快照。然后,每次内容更改时,另一个调用都会更新文档快照。

我只希望我的听众在数据更改时触发。我不希望它在应用程序加载时触发,以获取数据的初始状态。有什么建议?

Dou*_*son 8

Firestore 侦听器不是这样工作的。您将始终收到与获取或查询相关的文档,然后只要侦听器保持添加状态就会更新。没有仅接收增量的模式。

如果您只想接收某些数据,您可能想弄清楚如何查询它,例如,通过添加时间戳字段并让客户端只查询自之前某个时间以来已更改的文档。

  • 如果能够忽略初始状态,那就太好了。在我的应用程序中,我正在与 Firebase 同步数据,并将其存储在 CoreData 中以供我的应用程序进一步使用。很烦人的是,在应用程序启动时,我从侦听器中获取了所有数据,即使是我已经存储的数据。我现在需要找到一种方法来忽略这第一次发射。我们是否保证所有本地数据(初始状态)总会有 1 个响应,其中不包含来自服务器的任何新信息?如果是这样,我可以完全忽略来自侦听器的一个响应以实现我想要的功能。 (2认同)
  • 你不能忽视数据。您可以构建一个仅返回所需数据的查询。如果您无法构建这样的查询,那么您就不走运了。 (2认同)
  • 道格先生,感谢您对 SO 的官方支持。我对您的陈述“Firestore 侦听器不以这种方式工作”有疑问...文档指出,这种隐式行为的设计目的是为了方便使用初始状态填充 UI。在这种情况下,用户应该可以选择是否接收初始状态,对吧?像“ListenerOptions.getInitialState()”和“ListenerOptions.ignoreInitialState()”这样的字段将使“onSnapshot()”方法更加灵活,就像“SetOptions.merge()”一样!Firebaser,这个请求合理吗?:D (2认同)
  • @arcety 你好。我想我当时确实提交了一个...但我不确定发生了什么,因为没有请求跟踪器或反馈 ID...以防万一,我今天再次发送了相同的功能请求,感谢您让我知道。期待这个方便的功能!:) (2认同)

小智 5

在阅读了第一个和第二个解决方案后,我做出了一个似乎有效的解决方案。首先初始化一个变量true并在onSnapshot()方法内部检查这个变量是否为true,如果是,则将其更改为false,然后编写检索数据算法。像这样的东西:

var initState = true;

let observer = records.onSnapshot(docSnapshot => {

    console.log(`Received doc snapshot`);

    if (initState) {
        initState = false;
    } else {
        if (!docSnapshot.docChanges().empty) {     
            docSnapshot.docChanges().forEach(function (change) {
               //Write here wahtever you want

            });
        }
    }

}, err => {
    console.log(`Encountered error: ${err}`);
});
Run Code Online (Sandbox Code Playgroud)