Firebase 仅分离同一路径上的一个侦听器

Posted

技术标签:

【中文标题】Firebase 仅分离同一路径上的一个侦听器【英文标题】:Firebase detach only one of the listeners on the same path 【发布时间】:2018-07-24 02:43:28 【问题描述】:

我在同一条路径上有 2 个 firebase 侦听器。其中一个获取最新的项目,另一个是类似查询的,它提供特定的用户项目。两者都因价值而被解雇。是否可以分离其中一个侦听器而保留另一个?

postRef = db.ref(`posts/$location`)
postRef.orderByChild('timestamp').limitToLast(10).on("value", 
    function(snapshot) 
        dispatch(
        type: "POST_GET_POST",
        payload: snapshot.val()
    )
)

userRef = db.ref(`posts/`)
userRef.child(location).orderByChild("user").equalTo(user.uid).on("value", 
    function(snapshot) 
        dispatch(
          type: "POST_USER_POST",
          payload: snapshot.val()
    )
)

下面的代码只会关闭上面的两个监听器。

ref = db.ref(`posts/$location`)
ref.off

我考虑过将其中一个侦听器更改为 on child_added,这样我就可以将事件类型传递给 ref.off() 以选择该侦听器。然而,这种方法感觉像是在解决问题,所以我想知道这是否可以通过任何其他方式来实现。

【问题讨论】:

我不明白 - off() 接受三个参数,但在您的代码中,您甚至没有将其作为带括号的函数调用。 这应该是一个伪代码,但我使用的是 ref.off() 反正 【参考方案1】:

当您注册一个侦听器时,on() 返回对该精确侦听器的引用。如果您将该引用传递给 off(),则只会删除该侦听器。

所以:

var query = postRef.orderByChild('timestamp').limitToLast(10);
var listener = query.on("value", 
  ...

然后:

query.off(listener);

【讨论】:

将所有侦听器引用保留在应用程序状态中以便将它们传递给销毁或切换函数是否有意义? 这取决于您注册监听器的位置。我发现将on()off() 放在互补的生命周期事件中最方便,然后将侦听器引用保留在包含的组件/类中。 顺便说一句,我需要像上面那样声明查询和侦听器并存储它们,还是有一种方法可以进行单行调用和单个引用?

以上是关于Firebase 仅分离同一路径上的一个侦听器的主要内容,如果未能解决你的问题,请参考以下文章

更改 GeoServer 侦听器 IP 地址/端口

Firebase 侦听器或下拉刷新

删除/关闭 Firebase 侦听器

Firebase 事件侦听器的退避政策是啥?

Firebase 侦听器在 Java(Android) 中被阻止

何时在 tableView 单元中分离 firebase 侦听器?