典型的聊天应用。使用状态通道来告知谁在线,但是寻找一种优雅的方式在存在通道中用空闲标记标记用户。
答案 0 :(得分:8)
对此的完整解决方案可能相当复杂,并且还取决于运行时 - 我将假设Web Web客户端。
最终你需要一种做两件事的方法:
为了实现这一点,您可能只想要超时,并且只有在超时触发时才发送事件以指示用户处于空闲状态:
var timeout = null;
function sendUserIdle() {
// see part 2
}
function resetIdleTracking() {
if( timeout !== null ) {
// reset
clearTimeout( timeout );
}
timeout = setTimeout( sendUserIdle, 3*60*1000 ); // 3 minutes
}
window.addEventListener( 'mousemove', resetIdleTracking );
Pusher在线频道的缺失功能IMO能够更新在线状态信息。所以,你需要另一种方法来实现这一目标。我认为你有两个解决方案:
请参阅:accessing channel members。
function sendUserIdle() {
var channel = pusher.channel( 'presence-<your-channel>' );
// client events have to have a 'client-' prefix
channel.trigger( 'client-user-idle', channel.members.me );
}
function sendUserIdle() {
makeAjaxRequest( '/idle-notification-endpoint', channel.members.me );
}
注意:您可以使用channel.members.me
序列化JSON.stringify( channel.members.me )
在服务器上(伪代码):
userInfo = getUserInfoFromRequest();
pusher.trigger( 'presence-<your-channel>', 'user-idle', userInfo );
收到事件后,您将相应地更新用户UI列表(将该用户标记为空闲)。
channel.bind( 'user-idle', function( user ) {
var uniqueUserId = user.id;
// update UI
}