禁用 on('value') 缓存 firebase 实时数据库 JS SDK [关闭]
Posted
技术标签:
【中文标题】禁用 on(\'value\') 缓存 firebase 实时数据库 JS SDK [关闭]【英文标题】:Disable on('value') caching firebase realtime database JS SDK [closed]禁用 on('value') 缓存 firebase 实时数据库 JS SDK [关闭] 【发布时间】:2021-11-09 06:52:41 【问题描述】:放置实时数据库监听器时:
firebaseDb.ref(ref).on('value', (snapshot) =>
console.log('snap', snap);
const response = snapshot.val();
);
正在缓存快照以供以后脱机使用。如果我现在刷新页面,我的 console.log 将在我的控制台上出现两次。第一个是缓存快照,第二个是服务器快照。
我的应用程序非常复杂,举个例子,我有如下嵌套数据绑定:
const userBind = (userRef: string) => firebaseDb.ref(userRef).on('value', (snapshot) =>
console.log('snap', snap);
const user = snapshot.val();
store.commit(SET_USER, user);
getUserFriends(user)
);
const getUserFriends = await (user: User) =>
const userFriends = async getUserFriendsData() // call our backend
store.commit(SET_USER_FRIENDS, userFriends);
;
现在,store.commit(SET_USER, user);
被调用了两次,getUserFriendsData()
也开始成为性能问题。我认为我最好的选择是禁用实时数据库缓存。
如果有类似 android SDK 的功能就好了:FirebaseDatabase.getInstance().setPersistenceEnabled(true);
你们觉得呢?
亲切的问候, 弗洛里安。
【问题讨论】:
“你们怎么看?”对于 Stack Overflow 来说,这并不是一个很好的问题。您共享的代码有什么问题? 我分享的代码中一切正常。但是存在性能泄漏。我的后端被调用了两次而不是一次,因为由于数据被缓存,我得到了双重回调。 在 Firebase javascript SDK 中,页面重新加载之间不会缓存任何数据。你确定这是你看到的吗?如果是这样,您能否设置一个小型重现,以便我可以在 jsbin 或 stackblitz 之类的网站上查看? 【参考方案1】:不幸的是,实时数据库中的离线行为是“内置”的,对其工作方式没有太多控制。使用Firestore,您可以使用元数据检测数据是否来自缓存或服务器。也许迁移到该数据库将是一个解决方案。
使用实时数据库,您可以使用goOffline 断开与服务器的连接,稍后重新连接以将数据保存到服务器。但这感觉像是一个混乱的解决方案。通过使用它,您将只能从缓存中接收数据,但您将无法从服务器获取新数据。
您还可以优化您的状态管理,使其在接收到 sama 数据时不重新渲染,方法是使用您收到的数据的浅层比较并且已经存储了一个统计信息。
【讨论】:
以上是关于禁用 on('value') 缓存 firebase 实时数据库 JS SDK [关闭]的主要内容,如果未能解决你的问题,请参考以下文章