socket.io向特定用户发出并给予他们x个响应时间

时间:2016-02-26 11:05:55

标签: node.js socket.io

我在线聊天。它使用房间。如果用户发送消息而另一个用户不在线,则应增加“遗漏消息”计数器。我尝试使用setTimeout创建超时,如果它们发出事件,则会清除该超时。

然而,chatOnline并未按预期启动,这导致它始终报告用户处于离线状态并递增missed_textsrethinkdb列的计数器(未显示)因为它不相关)。

如何从socket.io中检索用户是否在线?我的目标是避免在数据库中存储状态信息,这可能会很快失控。

我试过的代码:

socket.on('chatSend',function(data){
    if(socket.client.user.room_id !== null){

        //were storing some crap in the socket object for easy retrieval. 
        data.user_id = socket.client.user.id;
        data.room_id = socket.client.user.room_id;
        data.timestamp = ~~(new Date() / 1000);

        //insert message into chat table
        r.table('chat').insert(data).run().then(function(res){


            //retrive generated record from table
            r.table('chat').get(res.generated_keys[0]).run().then(function(data2){


                io.sockets.in(data2.room_id).emit('chatNew',data);//emit to all users in room

                log('chatSend');

                //attempt to see if the other user is online
                getOtherUser(data2.room_id,socket.client.user.id,function(tid){

                    log('other user id: %d',tid);

                    //all users automatically join a room matching their user id when connecting.
                    //unsure how to see if the user is online. this doesnt work.
                    //this is what i need help with. retrieving the other users socket resource if they are online,
                    //and if they are not then return null or false, etc so i can work with that.
                    var othersocket = io.sockets.in(tid);


                    //if timeout completes before they respond, they are not online. 
                    var tmptime = setTimeout(function(){
                        log('other user not online.');
                        othersocket.removeListener('chatOnline',tmpfunc);
                        missedTexts(data2.room_id,tid,'INCR');
                    },5000);

                    var tmpfunc = function(){
                        clearTimeout(tmptime);
                        //remove the listener
                        othersocket.removeListener('chatOnline',tmpfunc);
                    };

                    //emit chatOnline to other user socket
                    //when they respond, cleartimeout, resulting in counter not being incremented.
                    othersocket.on('chatOnline',tmpfunc);
                    othersocket.emit('chatOnline');


                });

            });
        }); 
    }
});

0 个答案:

没有答案