Mic*_*elS 20 javascript jquery
我有以下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);
});
});
}
Run Code Online (Sandbox Code Playgroud)
为什么只setInterval执行checkIfGameAlreadyStarted一次,而不是每秒执行一次?
jfr*_*d00 70
您正在传递执行函数的结果而不是函数本身.由于函数的结果是未定义的,因此您正在执行checkIfGameAlreadyStarted,然后将undefined传递给setInterval,后者不执行任何操作.
而不是这个:
setInterval(checkIfGameAlreadyStarted(), 1000);
Run Code Online (Sandbox Code Playgroud)
你的陈述应该是这样的:
setInterval(checkIfGameAlreadyStarted, 1000);
Run Code Online (Sandbox Code Playgroud)
函数名末尾没有括号.
当你传递checkIfGameAlreadyStarted()它时立即调用函数并获得它的返回值.当你传递checkIfGameAlreadyStarted它时,会传递对函数的引用,这样setInterval可以稍后调用它(这就是你想要的).
要不checkIfGameAlreadyStarted带参数使用,请使用以下方法:
setInterval(checkIfGameAlreadyStarted, 1000);
Run Code Online (Sandbox Code Playgroud)
如果checkIfGameAlreadyStarted有一些参数需要传递,请使用以下方法:
setInterval(function(){checkIfGameAlreadyStarted(a,b);},1000)
Run Code Online (Sandbox Code Playgroud)
这是我见过的最好的方法。不过,欢迎其他经过良好测试的方法。
编辑
按照评论中的建议在超时后传递参数很酷,但使用我所说的上述方法有助于解决bind this问题,以防出现这样checkIfGameAlreadyStarted()的类方法this.checkIfGameAlreadyStarted()。
如果您想在超时后传递参数,这是它的工作原理,
setInterval(checkIfGameAlreadyStarted, 1000, parameter1, parameter2);
Run Code Online (Sandbox Code Playgroud)