Подтвердить что ты не робот

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 только один раз, а не каждую секунду?

4b9b3361

Ответ 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);