How to stop a setTimeout loop? How to stop a setTimeout loop? javascript javascript

How to stop a setTimeout loop?


setTimeout returns a timer handle, which you can use to stop the timeout with clearTimeout.

So for instance:

function setBgPosition() {    var c = 0,        timer = 0;    var numbers = [0, -120, -240, -360, -480, -600, -720];    function run() {        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');        if (c >= numbers.length) {            c = 0;        }        timer = setTimeout(run, 200);    }    timer = setTimeout(run, 200);    return stop;    function stop() {        if (timer) {            clearTimeout(timer);            timer = 0;        }}

So you'd use that as:

var stop = setBgPosition();// ...later, when you're ready to stop...stop();

Note that rather than having setBgPosition call itself again, I've just had it set c back to 0. Otherwise, this wouldn't work. Also note that I've used 0 as a handle value for when the timeout isn't pending; 0 isn't a valid return value from setTimeout so it makes a handy flag.

This is also one of the (few) places I think you'd be better off with setInterval rather than setTimeout. setInterval repeats. So:

function setBgPosition() {    var c = 0;    var numbers = [0, -120, -240, -360, -480, -600, -720];    function run() {        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');        if (c >= numbers.length) {            c = 0;        }    }    return setInterval(run, 200);}

Used like this:

var timer = setBgPosition();// ...later, when you're ready to stop...clearInterval(timer);

All of the above notwithstanding, I'd want to find a way to make setBgPosition stop things itself, by detecting that some completion condition has been satisfied.


I know this is an old question, I'd like to post my approach anyway. This way you don't have to handle the 0 trick that T. J. Crowder expained.

var keepGoing = true;function myLoop() {    // ... Do something ...    if(keepGoing) {        setTimeout(myLoop, 1000);    }}function startLoop() {    keepGoing = true;    myLoop();}function stopLoop() {    keepGoing = false;}


SIMPLIEST WAY TO HANDLE TIMEOUT LOOP

function myFunc (terminator = false) {    if(terminator) {        clearTimeout(timeOutVar);    } else {        // do something        timeOutVar = setTimeout(function(){myFunc();}, 1000);    }}   myFunc(true); //  -> start loopmyFunc(false); //  -> end loop