Javascript firebase onDiconnect带回调和不带回调

Javascript firebase onDiconnect带回调和不带回调,javascript,web,firebase,firebase-realtime-database,Javascript,Web,Firebase,Firebase Realtime Database,我遇到了一个有趣的情况。 所有firebase指南和手册都说,我们应该在所有其他操作之前使用.onDisconnect方法,以防止在值已设置但未描述“onDisconnect”行为(例如,由于突然断开互联网连接)时出现这种情况 例如: userRef.onDisconnect().remove(); userRef.set(value); 但当我快速连接/断开WIFI时,这种方法对我没有帮助。断开几次连接后,我注意到有些值没有被删除 之后,我尝试使用这样的代码: userRef.onDisco

我遇到了一个有趣的情况。 所有firebase指南和手册都说,我们应该在所有其他操作之前使用.onDisconnect方法,以防止在值已设置但未描述“onDisconnect”行为(例如,由于突然断开互联网连接)时出现这种情况

例如:

userRef.onDisconnect().remove();
userRef.set(value);
但当我快速连接/断开WIFI时,这种方法对我没有帮助。断开几次连接后,我注意到有些值没有被删除

之后,我尝试使用这样的代码:

userRef.onDisconnect().set(null, function(){
    userRef.set(value);
})
这种方法帮助我成功地解决了问题,并防止在不稳定的internet连接期间保存不必要的值。这是伟大的,但我仍然不明白为什么它的工作,并更好地工作比第一个变种。
所有的手册都说只要把
onDisconnect().remove()放进去就足够了在其他操作之前。可能是他们没有考虑到连接极不稳定的情况,或者我在某个地方弄错了?

如果您有一个所谓的不干净的断开连接(网络连接断开,而不是客户端以编程方式关闭),服务器可能需要一段时间才能检测到客户端已断开。确切的时间取决于套接字超时和其他变量,但通常可能需要几分钟的时间。在深入研究我的代码后,我发现在不正确设置“onDisconnect”选项的情况下可以创建记录。此外,我明白在开发firebase应用程序的过程中,我们应该为每个引用选择合适的方法,我指的是同步和异步风格。例如,如果有一些数据需要事务性保存,则应使用firebase事务处理方法。对于所有其他情况,您应该使用set和update方法,同步调用它们,并依靠firebase的代码本身将更改正确地推送到远程数据库。很高兴听到您找到了解决方案。如果您将其与相关代码片段一起作为答案发布,这可能对其他人也很有用。如果您有所谓的不干净断开连接(网络连接断开,而不是以编程方式关闭客户端),则服务器可能需要一段时间才能检测到客户端已断开。确切的时间取决于套接字超时和其他变量,但通常可能需要几分钟的时间。在深入研究我的代码后,我发现在不正确设置“onDisconnect”选项的情况下可以创建记录。此外,我明白在开发firebase应用程序的过程中,我们应该为每个引用选择合适的方法,我指的是同步和异步风格。例如,如果有一些数据需要事务性保存,则应使用firebase事务处理方法。对于所有其他情况,您应该使用set和update方法,同步调用它们,并依靠firebase的代码本身将更改正确地推送到远程数据库。很高兴听到您找到了解决方案。如果您将其与相关的代码片段一起作为答案发布,它可能对其他人也很有用。