2013-08-30 76 views
0

我在尝试处理Firebase中的网络连接丢失重新连接时遇到问题。Firebase网络连接丢失onDisconnect处理程序故障

当连接重新建立时,它的工作原理与此相似,并将用户数据重新写回到firebase,但是它会立即再次将其删除。从我可以告诉onDisconnect.remove()函数似乎是乱序发射。

这里是我的代码,也许有人能发现问题或提出一个更好的方式来处理网络连接丢失:

var userListRef = new Firebase('https://myrecovery.firebaseIO.com/tsmusers/'); 
    var meetingId = $('#meetingIdInput').val(); 
    var myUserId = $('#myIdInput').val(); 
    var userName = $('#nameInput').val(); 
    var avatar = $('#myImage').val(); 
    var myUserRef = new Firebase('https://myrecovery.firebaseIO.com/tsmusers/' + meetingId + '/users/' + myUserId); 
    var usersRef = new Firebase('https://myrecovery.firebaseIO.com/tsmusers/' + meetingId + '/users'); 
    var connectedRef = new Firebase("https://myrecovery.firebaseIO.com/.info/connected"); 

    // CHECK FIREBASE PRESENSE 
    connectedRef.on("value", function(isOnline) { 
     if (isOnline.val() === true) { 
      console.log('Connected to Firebase'); 
      // FIRE FUNCTION TO CONNECT TO THE MEETING 
      connectToMeeting(); 
     } else { 
      console.log('Disconnected from Firebase'); 
      // REMOVE USER FROM FIREBASE ON DISCONNECT 
      myUserRef.onDisconnect().remove(); 
     } 
    }); 

    // CONNECT TO THE MEETING 
    function connectToMeeting() { 
     // ADD USER TO FIREBASE MEETING->USER TABLE 
     myUserRef.set({userId: myUserId, userName: userName, avatar: avatar}); 

     // CONNECT TO OPENTOK 
     session.connect(apiKey, token); 
    } 

    // ADD USER TO ATTENDEE SECTION ON CONNECTION 
    usersRef.on('child_added', function(snapshot) { 
     var user = snapshot.val(); 
     displayConnectedUser(user.userId, user.avatar, user.userName); 
    }); 
    function displayConnectedUser(userId, avatar, userName) { 
     $('#attendees').prepend('<div id="attendee_' + userId + '" class="attendee_box">' + avatar + '<br />' + userName + '</div>'); 
    } 

回答

0

你必须使用onDisconnect()的时候,你是否在线。客户端在离线时无法与服务器通信,因此只有在您下次上线时才会执行onDisconnect()操作。您可以将代码更改为:

connectedRef.on("value", function(isOnline) { 
    if (isOnline.val() === true) { 
    console.log('Connected to Firebase'); 
    // FIRE FUNCTION TO CONNECT TO THE MEETING 
    connectToMeeting(); 
    // REMOVE USER FROM FIREBASE ON DISCONNECT 
    myUserRef.onDisconnect().remove(); 
    } 
} 

希望这有助于!

+0

啊啊,当然哈哈。 –

+0

它确实有效,但我不得不在我的代码中进行更改,以在onDisconnect删除后再次重写用户的数据,但是像冠军一样工作。谢谢! –