如何区分Firestore实时查询返回的是初始拉取数据还是后续更新?
实现方案
完全可以实现该需求,常用的稳定实现方式如下:
方案1:添加初始加载标记位(最通用,适配绝大多数场景)
onSnapshot 注册完成后第一次触发回调时返回的所有added类型变更,都是该查询匹配的初始全量数据,第一次回调执行完成后再触发的回调里的added变更才是监听器启动后新产生的新增数据,因此可以通过外部标记位区分:
// 外部声明初始加载状态标记 let isInitialLoadDone = false; let unsubscribe = firebase.firestore().collection('threads') .doc(threadData.threadId).collection('comments') .doc(item.commentId).collection('replies') .orderBy('timestamp', 'asc').onSnapshot(async (snapshot) => { snapshot.docChanges().forEach(change => { if (change.type === 'added') { if (!isInitialLoadDone) { // 处理初始拉取的文档数据 } else { // 处理监听器启动后新增的文档数据 } } }) // 第一次回调执行完成,标记初始加载结束 isInitialLoadDone = true; })
方案2:利用快照元数据判断(适配离线同步场景)
如果需要兼容离线后重新上线的同步场景,可以结合快照元数据属性做辅助判断:
snapshot.metadata.fromCache为true时,当前快照数据来自本地缓存,属于初始离线数据change.doc.metadata.hasPendingWrites为true时,对应文档是本地刚写入、还未同步到服务端的新增数据
该方案适用场景更局限,普通业务需求使用方案1即可。
内容的提问来源于stack exchange,提问作者Grant Singleton
相关产品推荐
相关产品推荐

