如果浏览器选项卡处于空闲状态,Firebase child_changed事件将随机丢失

时间:2018-12-04 22:02:36

标签: javascript angularjs firebase ionic-framework firebase-realtime-database

我正在构建一个实时应用程序,其中一个人正在进入该应用程序,并且该会话的所有已连接用户都被注意到或接收到有效载荷。

以下是我的Firebase child_changed侦听器,每个设备都在侦听该侦听器:

firebase.database().ref().child('collection')
    .orderByChild('sessionId')
    .equalTo('123') //unique id
    .on('child_changed', function (snapshot) {
    //some processing                 
});

每当有人进入应用程序时,我都会在Firebase文档/集合上方进行如下更新:

var newObject = {},
        fbId = 'Kh8nyd9C1FGeBx229ogyr';// unique id of document to be updated

newObject[fbId] = {
    'sessionId': '123',
    'payLoad': JSON.stringify(payLoad), //different payload to send to each device which is listening to collection and this session
    'lastUpdated': new Date().getTime() //adding unique time so child_changed should trigger
};

firebase.database().ref().child('collection').update(newObject);

//rules

"rules": {
    "$uid": {
        "collection": {
            ".read": "auth.uid == $uid",
                ".write": "auth.uid == $uid",
                    ".indexOn": ["sessionlId"]
        }  
    }
}

//data

{
  "Azublidegytttsbmnmnmnm": { //uid
    "collection": {
      "Kh8nyd9C1FGeBx229ogyr": {
        "sessionId": 123,
        "payLoad": {Id: '11', Name: 'John Doe'},
        "lastUpdated": 1543875382963 
      }
    }  
  }
}

上面的代码在大多数情况下都有效,但是如果浏览器选项卡保持空闲状态会错过事件,然后如果输入的人已经进入并且另一个连接的人的选项卡处于空闲状态,则它将停止接收该事件或无法触发child_changed事件。我刷新浏览器的Firebase连接代码后,现在一切正常。

对于每次触发此child_changed事件的任何帮助,我们深表感谢。或者,请提出其他解决此问题的方法。

我的firebase lib是3.5.3版本。

谢谢!

1 个答案:

答案 0 :(得分:0)

将我的firebase 3.5.3更新到最新版本。而且我已经开始直接在节点上绑定事件,而不是监听整个json集合(在根目录监听)。

旧代码:

firebase.database().ref().child('collection')
    .orderByChild('sessionId')
    .equalTo('123') //unique id
    .on('child_changed', function (snapshot) {
    //some processing                 
});

新代码:

firebase.database().ref().child('collection/Kh8nyd9C1FGeBx229ogyr') //Kh8nyd9C1FGeBx229ogyr here is firebase generated node and its unique id
    .on('child_changed', function (snapshot) {
    //some processing                 
});

P.S尝试收听最低级别的事件以获取child_changed事件。 从Firebase支持