仅在Firebase中的值更改时调用值事件处理程序

时间:2016-06-01 06:10:22

标签: firebase

有没有办法只在value中的值更改时调用Firebase事件处理程序?如果我只添加value事件处理程序而没有任何特殊代码,则在读取初始值然后对任何值更改时将调用一次。我想避免在读取初始值时调用事件处理程序。

我需要此功能的一个用例是我正在开发一个用户可以为其他用户添加任务的应用程序。其他用户可以接受或拒绝任务。有一个服务器正在Firebase上监视这些任务,并且每当用户接受或拒绝任务时,即每当任务状态发生变化时,它都会向任务的创建者发送推送通知。

我尝试了两种解决方案。

解决方案1:

如果value事件处理程序尚未存在且有条目存在,则在映射时向地图添加条目,然后执行值更改所需的工作。这个解决方案有效,但我需要在几个不同的情况下使用它,我必须在所有这些情况下创建这个地图,我没有发现它是一个方便的解决方案。

解决方案2:

像这样添加value事件处理程序

ref.on('value', (snapshot) => {
  console.log('Initial call ', this.initialCall); 
  if(!this.initialCall) {
    // Do work
  } else {
    this.initialCall = false;
  }
}, {initialCall: true})  // {initialCall: true} is the context which is provided as this in the event handler

我的想法是,我可以通过检查this.initialCall是否设置为true来检查是否为初始值调用了事件处理程序。如果是,则将this.initialCall设置为false,然后在后续调用中,this.initialCall应为false,我可以完成值更改所需的工作。使用此解决方案,我观察到this.initialCall第一次调用处理程序时undefinedtrue,然后将其设置为true,然后所有值都为value更改所有任务的事件处理程序调用,而不仅仅是将其设置为true的任务。

关于解决方案2,我不是JS专家,由于我的JS知识存在一些差距,我可能做错了,因为它没有按照我的预期工作。

如果您有一个想法/解决方案可以用来仅在价值变化时调用{{1}}事件处理程序,请告诉我。

1 个答案:

答案 0 :(得分:2)

Firebase中的value事件会立即使用当前值调用,然后在值更改时立即调用。如果您只关注值的变化,则可以忽略初始事件:

var isInitialValue = true;
ref.on('value', function(snapshot) {
  if (isInitialValue) {
    isInitialValue = false;
  }
  else {
    // TODO: handle subsequent changes
  }
});