【发布时间】:2025-12-06 21:10:01
【问题描述】:
我正在使用 MERN 堆栈和 SocketIO 制作一个基于回合的多人游戏。我希望每个玩家在游戏将他们踢出局之前有 60 秒的时间轮到他们上场。一旦该玩家播放,我希望取消计时器。我尝试为游戏中的每个玩家创建一个 setTimeout 函数,然后使用 clearTimeout 根据 socketIO 事件取消计时器,但实际上并没有取消计时器。这可能是一个实现问题,所以我想知道实现此功能的最佳方法是什么?这是我当前的实现:
socket.on('Start Countdown', () => {
let user = getUser(socket.id);
user.countDown = setTimeout(() => {
socket.emit('Error', { error: { msg: 'You took too long' } });
socket.emit('AFK');
}, 60000);
});
socket.on('Stop Countdown', () => {
let user = getUser(socket.id);
if (user.countDown) {
clearTimeout(user.countDown);
console.log(user.countDown);
}
console.log(user.countDown);
});
如前所述,当“停止倒计时”发生时,计时器不会被取消。 注意:getUser 根据提供的 socket.id 从 users 数组返回一个 js 对象 user,形式为 {socketId, userId, roomId, countDown}。该数组中不会有两个元素具有相同的 userId,并且在刷新时,socketId 元素将更新为正确的 socket.id。因此,您可以假设 getUser 每次都会返回相同的用户对象,即使在刷新之后也是如此。
【问题讨论】:
标签: javascript node.js socket.io settimeout backend