删除/关闭 Firebase 侦听器

Posted

技术标签:

【中文标题】删除/关闭 Firebase 侦听器【英文标题】:Remove/Off for Firebase Listeners 【发布时间】:2019-01-24 22:21:19 【问题描述】:

我有 Vue 组件正在侦听 Firebase 事件,并在安装它们时创建 Firebase 引用/侦听器。但是当用户离开该页面时,我想删除 beforeDestroy() 生命周期挂钩中的所有侦听器。这是删除 Firebase ref/listeners 的“正确”方式吗?

getFirebaseRef(path)
  return firebase.database().ref(path)
,

beforeDestroy()
  // get firebase ref
  let fbPath = `/projects/proj_$this.currentLessonId/components/$this.component.id`
  this.getFirebaseRef(fbPath)
  .then((ref) => 
    // remove listener
    ref.off("value", (snap) => 
    )
    ref.off("child_added", (snap) => 
    )
    ref.off("child_removed", (snap) => 
    )
  )
,


mounted()
  // get firebase ref
  let fbPath = `/projects/proj_$this.currentLessonId/components/$this.component.id`
  this.getFirebaseRef(fbPath)
  .then((ref) => 
    // add listener
    ref.on("value", (snap) => 
      doSomething1()
    )
    ref.on("child_added", (snap) => 
      doSomething2()
    )
    ref.on("child_removed", (snap) => 
      doSomething3()
    )
  )
,

【问题讨论】:

【参考方案1】:

你总是可以打电话,但如果你在同一条路径上有多个监听器,它会变得更棘手。

ref.off("value")

侦听器返回对该侦听器的引用,所以我就是这样做的。

let listener = ref.on("value", function(snapshot)
//do something


ref.off("value", listener)

【讨论】:

在你的例子中,这是否意味着在“做某事”之后,监听器会关闭?那么“价值”的后续变化呢? 在你调用 ref.off 之前,监听器不会关闭。我只是把它放在那里作为你的听众所做的任何工作的占位符。 您可能必须传递该侦听器变量,但这取决于您要调用 ref.off 的位置 ref.off("value", callback) 像这样传递参数和回调对我不起作用 :( 。只是 .off() 工作得很好。【参考方案2】:

Firebase 能够分离监听器 通过调用 Firebase 数据库引用的 off() 方法来移除回调。

您可以通过将单个侦听器作为参数传递给 off() 来删除它。在不带参数的位置调用 off() 会删除该位置的所有侦听器。

在父监听器上调用 off() 不会自动删除在其子节点上注册的监听器;还必须在任何子侦听器上调用 off() 以删除回调。 阅读更多请点击此链接。 https://firebase.google.com/docs/database/web/read-and-write

【讨论】:

谢谢,这应该是公认的答案。

以上是关于删除/关闭 Firebase 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

关闭应用程序时将 Firebase 侦听器保留在内存中

删除 Firebase java 中的所有侦听器

Firebase 侦听器或下拉刷新

如何从Button的onClick侦听器中删除Firebase DataBase

在明确删除之前,SingleValueEvent 侦听器是不是计入 Firebase RealTime DB 中的“同时连接”?

如何删除 firebase.notifications().onNotificationOpened 监听器?