Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JS setInterval executes only once

Tags:

I have the following JS functions:

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);              });     }); } 

Why does setInterval executes checkIfGameAlreadyStarted only once, and not every second?

like image 907
MichaelS Avatar asked Oct 12 '11 20:10

MichaelS


People also ask

How many times does setInterval run?

When your code calls the function repeatEverySecond it will run setInterval . setInterval will run the function sendMessage every second (1000 ms).

Does setInterval repeat?

Yes, setInterval repeats until you call clearInterval with the interval to stop.

What does setInterval () method do in JS?

The setInterval() method calls a function at specified intervals (in milliseconds). The setInterval() method continues calling the function until clearInterval() is called, or the window is closed.


2 Answers

You are passing the result of executing the function instead of the function itself. Since the result of the function is undefined, you are executing checkIfGameAlreadyStarted and then passing undefined to setInterval which doesn't do anything.

Instead of this:

setInterval(checkIfGameAlreadyStarted(), 1000); 

Your statement should be this:

setInterval(checkIfGameAlreadyStarted, 1000); 

without the parentheses at the end of the function name.

When you pass checkIfGameAlreadyStarted() that calls the function immediately and gets it's return value. When you pass checkIfGameAlreadyStarted that passes a reference to the function so setInterval can call it later (which is what you want).

like image 147
jfriend00 Avatar answered Nov 02 '22 09:11

jfriend00


To use checkIfGameAlreadyStarted without parameters, use the method below:

setInterval(checkIfGameAlreadyStarted, 1000); 

In case checkIfGameAlreadyStarted has some parameters to be passed, use the method below:

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

This is the best approach I have seen. Other well tested methods are welcomed ,though.

Edit

Passing parameters after the timeout as suggested in the comments is cool but using the above method I stated helps to combat the bind this problem in case checkIfGameAlreadyStarted() is a class method like this this.checkIfGameAlreadyStarted().

In case you want to pass parameters after timeout, here is how it works,

setInterval(checkIfGameAlreadyStarted, 1000, parameter1, parameter2); 
like image 29
Akintunde Avatar answered Nov 02 '22 08:11

Akintunde