禁用 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何取消编辑/禁用缓存输入(文本类型)值?

mybatis的缓存机制

如何禁用ECSHOP缓存,如何关闭ECSHOP缓存

启用MySQL查询缓存

启用MySQL查询缓存

更新缓存出现FDZH源已禁用,怎么解决,错误如下