2

我正在做有关新消息的通知。我想我需要为每个用户打开套接字,并且服务器会在收到新消息时发送通知。我想使用 socket.io 和 redis pub/sub。当用户发送消息时,它会将此事件发布到将成为订阅者的 redis 和 nodejs 服务器,并将通知客户端新消息。但是在这种情况下,消息会立即从队列中删除,当用户更新页面时,他会收到通知说所有消息都已读取,因为队列为空,但实际上没有读取消息。如何决定这个问题?

4

2 回答 2

1

我已经为多页网络应用程序做了类似的事情,但现在它是单页的,我不再需要它了:

var notifications=[]
...
socket.on('notify', function(message)
{
    console.log('new notification received!');
    if(notifications[message.notificationId]!==message.notificationId){
        //notification never received in the current page

        notifications[message.notificationId]=message.notificationId;

        //display the notification code here


        //In a closure instead of 3 params in order to keep compatibility with IE
        setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);


    }
    else{
        //notification already received
        emitConfirm(message.notificationId);
        //or setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);
    }
});
于 2012-08-15T19:44:39.383 回答
0

如果我理解正确,所有用户都使用 socket.io 保持一个网络套接字打开,任何新消息都会立即发送给所有用户并标记为未读。问题很简单,如果用户刷新,那么应用程序不知道将哪些消息标记为已读和未读。

在这种情况下,您的消息可能有一个时间戳,您可以记录每个用户实际阅读的最后一条消息的时间戳(例如,从客户端向服务器发出一个消息读取事件),这样当用户刷新页面时,仍然有从中重建已读和未读消息列表的信息。

于 2012-07-18T23:06:40.237 回答