JS setInterval выполняется только один раз
У меня есть следующие JS-функции:
function checkIfGameAlreadyStarted(){
$.get("IsGameAlreadyStarted",null,function(gameAlreadyStarted){
if (gameAlreadyStarted == "true"){
window.location = "index.jsp?content=game";
} else{
alert("bla");
}
});
}
function joinGame(playerForm){
$.get("GenerateClientID",null,function(clientID){
$.get("JoinGame",{
"NAME" : playerForm.elements[0].value,
"ID" : clientID
}
,function(gameParam){
$("#waitingContainer").append("You have joined the game!<br\>Waiting for game creator to start game..");
setInterval(checkIfGameAlreadyStarted(), 1000);
});
});
}
Почему setInterval
выполняет checkIfGameAlreadyStarted
только один раз, а не каждую секунду?
Ответы
Ответ 1
Вы передаете результат выполнения функции вместо самой функции. Поскольку результатом функции является undefined, вы выполняете checkIfGameAlreadyStarted, а затем передаете undefined в setInterval, который ничего не делает.
Вместо этого:
setInterval(checkIfGameAlreadyStarted(), 1000);
Ваше выражение должно быть следующим:
setInterval(checkIfGameAlreadyStarted, 1000);
без круглых скобок в конце имени функции.
Когда вы передаете checkIfGameAlreadyStarted()
, который немедленно вызывает функцию и получает ее возвращаемое значение. Когда вы передаете checkIfGameAlreadyStarted
, который передает ссылку на функцию, поэтому setInterval может вызывать ее позже (это то, что вы хотите).
Ответ 2
Чтобы использовать checkIfGameAlreadyStarted
без параметров, используйте метод ниже:
setInterval(checkIfGameAlreadyStarted, 1000);
В случае, если checkIfGameAlreadyStarted
имеет некоторые параметры для передачи, используйте метод ниже:
setInterval(function(){checkIfGameAlreadyStarted(a,b);},1000)
Это лучший подход, который я видел. Другие хорошо проверенные методы приветствуются.
редактировать
Передача параметров после тайм-аута, как предложено в комментариях, это круто, но использование вышеупомянутого метода, который я указал, помогает бороться с bind this
проблемой в случае, если checkIfGameAlreadyStarted()
является методом класса, подобным this.checkIfGameAlreadyStarted()
.
Если вы хотите передать параметры после тайм-аута, вот как это работает,
setInterval(checkIfGameAlreadyStarted, 1000, parameter1, parameter2);