为什么 'clearTimeout' 在这种情况下不起作用?
Why would 'clearTimeout' not work in this scenario?
我在代码中从 运行 'clearTimeout()' 停止 'gameTimer' 计时器时遇到问题。我在这里简化了部分代码,只包含必要的细节。
//This runs when someone connects to my website
io.on('connection', function (socket) {
let gameTimer;
//Runs the in-game timer
function questionCountdown() {
gameTimer = setTimeout(function () {
//Reveal if the players' answers are right or wrong
revealAnswer(answeredPlayers, playerData[socket.id].room);
//Start the countdown for the next question
countToNextQuestion(playerData[socket.id].room);
}, 21000)
}
//Starts the game
socket.on('Request Game Start', async function (room) {
questionCountdown();
})
//Runs when a player has answered(ignore the function arguments)
socket.on('Answered Question', function () {
//If all users in the room have answered...
if (answeredPlayers.get(playerData[socket.id].room) == (roomMap.get(playerData[socket.id].room)).length) {
//Stop the count[THE MAIN ISSUE]
clearTimeout(gameTimer);
//Reveal if the players' answers are right or wrong
revealAnswer(answeredPlayers, playerData[socket.id].room);
//Start the countdown for the next question
countToNextQuestion(playerData[socket.id].room);
}
})
})
为什么 socket.on('Answered Question', function () {
中使用的“clearTimeout()”不起作用?
在您的代码中,由于超时设置是由事件触发的,因此可能会在未设置 gameTime
的情况下调用 clearTimeout
get。此外 clearTimeout
正在被一个事件触发,如果该事件没有触发,超时将不会被清除。
问题可能出在您的事件源上。他们何时何地被触发?
您还可以测试您的 if
语句。在调用 clearTimeout
之前放置一个 console.log
并查看它是否在您需要时得到 运行。
clearTimeout()
没有停止先前启动的可能原因 gameTimer
:
socket.on('Answered Question', ...)
事件并没有像您认为的那样发生。它要么永远不会发生,要么发生得太快。
- 条件
if (answeredPlayers.get(playerData[socket.id].room) == (roomMap.get(playerData[socket.id].room)).length)
未被满足或抛出,因此您永远无法到达 clearTimeout()
。
- 您在停止一个之前为给定用户启动了多个
gameTimer
,因此第二个会覆盖第一个的计时器,然后您永远不会停止第一个。
- 您的用户离开网页或点击刷新,并且由于您没有显示正在侦听
disconnect
事件,您留下了一个永远无法停止的 gameTimer
运行。仅供参考,无论它是否是您正在查看的当前问题的原因,都应该解决这个问题。
- 由于每个 socket.io 连接都有自己的
gameTimer
,您只是对它是否停止感到困惑,也许一个 gameTimer
正在停止,而您'我们只是被以下事实所愚弄:还有其他 运行 属于不同的联系。
仅供参考,您可以通过适当的 console.log()
语句找出是否是这些原因,然后研究日志。这些时间敏感、事件驱动的问题通常通过详细的日志记录来解决,然后研究日志以准确了解您的代码中发生了什么和没有发生什么以及发生的顺序。
我在代码中从 运行 'clearTimeout()' 停止 'gameTimer' 计时器时遇到问题。我在这里简化了部分代码,只包含必要的细节。
//This runs when someone connects to my website
io.on('connection', function (socket) {
let gameTimer;
//Runs the in-game timer
function questionCountdown() {
gameTimer = setTimeout(function () {
//Reveal if the players' answers are right or wrong
revealAnswer(answeredPlayers, playerData[socket.id].room);
//Start the countdown for the next question
countToNextQuestion(playerData[socket.id].room);
}, 21000)
}
//Starts the game
socket.on('Request Game Start', async function (room) {
questionCountdown();
})
//Runs when a player has answered(ignore the function arguments)
socket.on('Answered Question', function () {
//If all users in the room have answered...
if (answeredPlayers.get(playerData[socket.id].room) == (roomMap.get(playerData[socket.id].room)).length) {
//Stop the count[THE MAIN ISSUE]
clearTimeout(gameTimer);
//Reveal if the players' answers are right or wrong
revealAnswer(answeredPlayers, playerData[socket.id].room);
//Start the countdown for the next question
countToNextQuestion(playerData[socket.id].room);
}
})
})
为什么 socket.on('Answered Question', function () {
中使用的“clearTimeout()”不起作用?
在您的代码中,由于超时设置是由事件触发的,因此可能会在未设置 gameTime
的情况下调用 clearTimeout
get。此外 clearTimeout
正在被一个事件触发,如果该事件没有触发,超时将不会被清除。
问题可能出在您的事件源上。他们何时何地被触发?
您还可以测试您的 if
语句。在调用 clearTimeout
之前放置一个 console.log
并查看它是否在您需要时得到 运行。
clearTimeout()
没有停止先前启动的可能原因 gameTimer
:
socket.on('Answered Question', ...)
事件并没有像您认为的那样发生。它要么永远不会发生,要么发生得太快。- 条件
if (answeredPlayers.get(playerData[socket.id].room) == (roomMap.get(playerData[socket.id].room)).length)
未被满足或抛出,因此您永远无法到达clearTimeout()
。 - 您在停止一个之前为给定用户启动了多个
gameTimer
,因此第二个会覆盖第一个的计时器,然后您永远不会停止第一个。 - 您的用户离开网页或点击刷新,并且由于您没有显示正在侦听
disconnect
事件,您留下了一个永远无法停止的gameTimer
运行。仅供参考,无论它是否是您正在查看的当前问题的原因,都应该解决这个问题。 - 由于每个 socket.io 连接都有自己的
gameTimer
,您只是对它是否停止感到困惑,也许一个gameTimer
正在停止,而您'我们只是被以下事实所愚弄:还有其他 运行 属于不同的联系。
仅供参考,您可以通过适当的 console.log()
语句找出是否是这些原因,然后研究日志。这些时间敏感、事件驱动的问题通常通过详细的日志记录来解决,然后研究日志以准确了解您的代码中发生了什么和没有发生什么以及发生的顺序。