我有以下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
,而不是每一秒执行一次?
答案 0 :(得分:66)
您正在传递执行函数的结果而不是函数本身。由于函数的结果是未定义的,因此您正在执行checkIfGameAlreadyStarted,然后将undefined传递给setInterval,后者不执行任何操作。
而不是:
setInterval(checkIfGameAlreadyStarted(), 1000);
你的陈述应该是这样的:
setInterval(checkIfGameAlreadyStarted, 1000);
在函数名末尾没有括号。
当您传递立即调用该函数的checkIfGameAlreadyStarted()
并获取其返回值时。当你传递checkIfGameAlreadyStarted
传递给函数的引用时,setInterval可以稍后调用它(这就是你想要的)。
答案 1 :(得分:2)
要使用不带参数的checkIfGameAlreadyStarted
,请使用以下方法:
setInterval(checkIfGameAlreadyStarted, 1000);
如果checkIfGameAlreadyStarted
有一些要传递的参数,请使用以下方法:
setInterval(function(){checkIfGameAlreadyStarted(a,b);},1000)
这是我所见过的最好的方法。但是,欢迎使用其他经过良好测试的方法。
修改
按照注释中的建议在超时后传递参数很酷,但是我使用的上述方法有助于解决bind this
问题,以防checkIfGameAlreadyStarted()
是像这样的类方法this.checkIfGameAlreadyStarted()
如果要在超时后传递参数,请按以下步骤操作
setInterval(checkIfGameAlreadyStarted, 1000, parameter1, parameter2);