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

仅在Firebase中的值更改时调用值事件处理程序,firebase,Firebase,是否有方法仅在Firebase中的值更改时调用值事件处理程序?如果只添加值事件处理程序,而不添加任何特殊代码,则在读取初始值时会调用它一次,然后在任何值更改时都会调用它。我希望避免在读取初始值时调用事件处理程序 我需要此功能的一个用例是,我正在开发一个应用程序,用户可以在其中为其他用户添加任务。其他用户可以接受或拒绝任务。有一台服务器在Firebase上监视这些任务,每当用户接受或拒绝任务时,即当任务状态发生变化时,该服务器向任务创建者发送推送通知 我尝试了两种解决方案 解决方案1: 当调用值事

是否有方法仅在
Firebase
中的值更改时调用
事件处理程序?如果只添加
事件处理程序,而不添加任何特殊代码,则在读取初始值时会调用它一次,然后在任何值更改时都会调用它。我希望避免在读取初始值时调用事件处理程序

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

我尝试了两种解决方案

解决方案1:

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

解决方案2:

像这样添加
事件处理程序

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
在第一次调用处理程序时是
未定义的,然后将其设置为
true
,然后对所有任务的所有值更改事件处理程序调用都是
true
,而不仅仅是对其设置为true的任务

关于解决方案2,我不是一个JS专家,可能是由于我的JS知识有一些差距,我做了一些错误的事情,因为它没有像我预期的那样工作


请告诉我您是否有一个想法/解决方案,仅在值更改时才可用于调用
事件处理程序。

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

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

谢谢你的回复。当解决方案简单得多的时候,我正试图将其过度复杂化。另一方面,你认为我尝试的第二种解决方案有什么问题吗。我想我可以使用
上下文
将一些数据传递给事件处理程序并在内部使用,但我没有在事件处理程序中收到数据。如果你想让我为这个问题提出一个不同的问题,请让我知道。