JS setInterval 只执行一次

IT技术 javascript jquery
2021-03-15 19:39:22

我有以下 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一次,而不是每秒执行一次?

2个回答

您正在传递执行函数的结果而不是函数本身。由于函数的结果未定义,您正在执行 checkIfGameAlreadyStarted,然后将 undefined 传递给 setInterval,它什么也不做。

取而代之的是:

setInterval(checkIfGameAlreadyStarted(), 1000);

你的陈述应该是这样的:

setInterval(checkIfGameAlreadyStarted, 1000);

函数名末尾没有括号。

当您传递checkIfGameAlreadyStarted()它时,立即调用该函数并获取它的返回值。当您传递checkIfGameAlreadyStarted该函数的引用时, setInterval 可以稍后调用它(这就是您想要的)。

要不checkIfGameAlreadyStarted带参数使用,请使用以下方法:

setInterval(checkIfGameAlreadyStarted, 1000);

如果checkIfGameAlreadyStarted有一些参数需要传递,请使用以下方法:

setInterval(function(){checkIfGameAlreadyStarted(a,b);},1000)

这是我见过的最好的方法。不过,欢迎其他经过良好测试的方法。

编辑

按照评论中的建议在超时后传递参数很酷,但使用我所说的上述方法有助于解决bind this问题,以防万一checkIfGameAlreadyStarted()是这样的类方法this.checkIfGameAlreadyStarted()

如果您想在超时后传递参数,这是它的工作原理,

setInterval(checkIfGameAlreadyStarted, 1000, parameter1, parameter2);
您也可以在超时后传递参数,但您需要一个 IE9- 的 polyfill。developer.mozilla.org/en-US/docs/Web/API/...
2021-04-21 19:39:22