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