题我正在使用为聊天室setTimeout()实现“用户正在键入”消息。超时存储在句柄中,以便可以在连续按键时清除超时并重置,以便超时真正代表用户完成输入的时间。但是,假设有一个聊天室,里面有聊天者 A、B 和 C。如果 A 开始打字,那么 B 开始打字,A 的超时被清除并且永远不会消失。那么,有没有一种方法可以动态创建超时句柄,以便无论聊天室中有多少用户或当前正在打字,我都只能清除相应的句柄?代码索引.jsio.on('connection', function(socket){ socket.on('csTyping', function(user){ socket.broadcast.emit('scTyping', user); });});聊天.jsvar typingLock = false;var tMsgTimeout = 1 * 1000;var tLockTimeoutHandle = window.setTimeout(() => { typingLock = false;}, tMsgTimeout);window.clearTimeout(tLockTimeoutHandle);var tMsgTimeoutHandle = window.setTimeout(() => { removeTypingMsg(0);}, tMsgTimeout);window.clearTimeout(tMsgTimeoutHandle);message.addEventListener('keypress', function(){ if (!typingLock) { socket.emit('csTyping', clientUsername); typingLock = true; window.clearTimeout(tLockTimeoutHandle); tLockTimeoutHandle = window.setTimeout(() => { typingLock = false; }, tMsgTimeout); }});socket.on('scTyping', function(user){ feedback.innerHTML += "<p id='typing" + user + "'><em>" + user + " is typing a message...</em></p>"; window.clearTimeout(tMsgTimeoutHandle); tMsgTimeoutHandle = window.setTimeout(() => { removeTypingMsg('typing' + user); }, tMsgTimeout);});
1 回答
![?](http://img1.sycdn.imooc.com/5458692c00014e9b02200220-100-100.jpg)
慕码人8056858
TA贡献1803条经验 获得超6个赞
将您的超时句柄存储在一个对象中,就像这样
var timeouts = {};
timeouts[clientUsername] = setTimeout(function(){}, 1000);
然后你可以用这个清除超时:
clearTimeout(timeouts[clientUsername]);
虽然,而不是使用大量超时,我会推荐一种不同的方法:使用 setInterval 定期检查事件发生时的时间戳 - 如果时间戳超过 10 秒(或多旧),那么您可以执行您的代码想。
添加回答
举报
0/150
提交
取消