当前位置: 首页 > 知识库问答 >
问题:

Firebase onDisconnect()多次触发

蒋阳华
2023-03-14

在firebase文档之后构建一个存在的应用程序,有没有这样一个场景,当应用程序仍然连接时,on-disconnect会触发?我们看到存在节点显示应用程序离线,然后在几秒钟内恢复在线,而我们没有失去网络连接。

我们在安装在现场的多个嵌入式设备上看到,存在设置为false,然后几乎立即恢复为true,并且在几秒钟内发生在所有设备上。从我们所做的测试和在线文档中,我们知道如果我们在设备上失去互联网连接,大约需要60秒,服务器上的超时才会触发onDisconnect()方法。

此后,我们在存在方法中添加了代码,如果设备在应用程序实际运行时看到存在节点设置为false,它会将存在重置为true。有时发生这种情况时,我们会得到一次写回true,这就是它的结束,其他时候就像服务器和客户端在互相争斗,节点在50-200毫秒的过程中多次重置为true。每次我们强制存在返回true时,我们都会通过推送到设备GUID中的另一个节点来监控这一点。这仅在模块运行时和最初建立存在之后发生。

这是我们从运行在设备上的各种模块中调用的方法,以便我们可以在任何给定时间监控每个模块的状态。

exports.online = function (program, currentProgram) {
 var programPath = process.env.FIREBASE_DEVICES + process.env.GUID + '/status/' + program
  var onlinePath = process.env.FIREBASE_DEVICES + process.env.GUID + '/statusOnlineTimes/' + program
  var programRef = new firebase(programPath);
  var statusRef = new firebase(process.env.FIREBASE_DEVICES + process.env.GUID + '/status/bootup');
  var onlineRef = new firebase(onlinePath)
  amOnline.on('value', function(snapshot) {
    if (snapshot.val()) {
      programRef.onDisconnect().set(false);
      programRef.set(true);
      programRef.on('value', function(snapshot){
        if (snapshot.val() == false){
          programRef.set(true);
          console.log('[NOTICE] Resetting', program, 'module status back to True after Fireabase set to False')
          var objectToPush = {
            program: program,
            time: new Date().toJSON()
          }
          onlineRef.push(objectToPush)
        }
      })
      if (currentProgram != undefined) {
        statusRef.onDisconnect().set('Offline')
        statusRef.set(currentProgram)
      }
    }
  }); 

我们面临的问题是,有没有一个实例,其中 Firebase 正在调用 onDisconnect() 方法,即使它实际上并没有失去其状态?我们遇到过这样的情况,在我们添加重置代码之前,我们会看到设备脱机,然后在60秒内重新联机。重置代码是为了解决我们在现场遇到的另一个问题,如果设备的电源中断并且没有干净退出,则设备可以重新启动,并在先前实例的超时触发之前使用新的UID重置存在。然后,一旦超时触发,即使设备实际上处于联机状态,设备也会显示为脱机。

共有1个答案

西门山
2023-03-14

因此,我们能够通过在程序Ref.on(...)调用之前直接添加程序Ref.off()调用来阻止设备重新连接时发生的多次推送。我们确定要发生的是,每当设备从脱机状态联机并且amOnline.on(...)回调触发时,它就会创建一个新的侦听器。

现在我们可以处理onDisconnect()从早期程序PID触发并以脱机状态覆盖当前活动程序的情况。这似乎解决了我们遇到的问题,即在未完全退出的实例中,在onDisconnect()触发之前,该字段中的设备能够重新启动并重新获得连接。

我们仍然存在一个问题,即所有设备都在大约同一时间(在1-3秒内)关闭然后重新上线。Firebase是否有重置./info/连接节点的情况?因为我们正在监控状态并实际登录和关闭事件,也许我们只是捕获了大多数人看不到的事件?还是我们做错了什么?

 类似资料:
  • 问题内容: 我知道这个问题已经被问过多次了,但是没有人能够从我所看到的问题中得出一个可行的答案。 我正在开发一个应用程序以拦截短信,并根据发送的#弹出自定义提醒。我让它与广播接收器完美配合,但是,如果用户安装了goSms,则永远不会调用该方法,因为goSms在它到达我的应用程序之前会中止它。 为了解决这个问题,我尝试在内容观察器上 正常工作,但是使用相同的参数调用了两次。香港专业教育学院试图检查时

  • 我刚开始流口水,遇到了一个问题。 我简化了规则以显示问题: 基本上,我想计算特定路段上发生的事件(路段是道路的一部分)。当同一链接上发生3个事件时,我希望触发规则。 上面的规则几乎起作用了,但是当它发射时,它发射了3次,每个事件发射一次。我只希望它发射一次。 我错过了什么? 非常感谢。

  • 我对TextWatcher有一个恼人的问题。我一直在网上搜索,但什么也找不到。如果有人能帮助我,我将不胜感激。 由于某些原因,在一次文本更改时对TextWatcher事件的调用是不稳定的。有时它们被触发一次(就像它们应该被触发的那样),有时两次,有时三次。不知道为什么,整个事情都很直截了当。有时,PostTextChanged()上的可编辑参数在toString()和length()中返回空值。

  • 问题内容: 我试图用Javascript编写视频扑克游戏,以降低其基础知识,但是我遇到了一个问题,其中jQuery click事件处理程序多次触发。 它们被附加到用于下注的按钮上,并且对于在游戏过程中第一手下注(仅触发一次)非常有效。但是在秒针下注中,每次按下一个下注或下注按钮都会触发两次点击事件(因此,每次按下正确的赌注量是两次)。总体而言,在按一次下注按钮时,触发单击事件的次数遵循此模式序列的

  • 我的存储库实现遇到了一个奇怪的问题。每次调用应该从数据库获取数据并通过网络调用更新数据库的函数时,我都会从数据库观察器收到多个结果。 基本上,如果我调用一次GetApplianceControl,就会得到所需的结果。然后我再次调用另一个序列号,它是空的,我得到了空数组。但是,我第三次调用,但是使用与第一次相同的序列号,在进行insert调用后,我得到了正确结果和空数组的混合。 像这样: 第一次呼叫

  • 我有一个 Blob 存储容器,其中配置了事件网格触发器(Blob 已创建)。我正在通过数据工厂加载此 blob 存储文件,很多时候,许多文件可能会在一次尝试中出现在此 blob 中。也许我们可以举一个20个文件的例子。 好消息是我的事件网格触发器启动了,函数app被调用。然而,我发现有时对于同一个文件,事件网格触发器被触发了不止一次。 在这20个文件中,很少有文件非常大,比如300 MB,但其他文