Gurunandan Bhat
Gurunandan Bhat

Reputation: 3562

Is it OK to call clearInterval inside a setInterval handler?

I have a piece of Javascript that checks for a condition (via an AJAX call) every n seconds. If that condition is true, it stops checking. I have implemented it in the following way:

var stopTimer;
var timerId = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) {
        clearInterval(timerId);
    }
}, 10000);

However, I find erratic behaviour: Works sometimes, but at other times, it keeps checking forever. I have checked that (as much as is possible) there is no error in any part of the code.

I am therefore suspecting that calling clearInterval inside a setInterval handler might be the culprit. Is that right? Is it OK to call clearInterval inside a setInterval handler?

Thank you for your attention

Upvotes: 39

Views: 16397

Answers (3)

Simon_Weaver
Simon_Weaver

Reputation: 146000

Make sure you're not inadvertently re-using the same timer name elsewhere in your code which would result in you always stopping the second timer to be defined.

Either give the timer a unique name, or scope it to a function

var timerForAjax = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) 
    {
        clearInterval(timerForAjax);
    }
}, 10000);

I was careless enough to call my timer interval and didn't realize I was creating two timers in the same scope both called interval. Blamed iOS8 for about an hour until I realized that that was nothing to do with it.

Upvotes: 2

rahul
rahul

Reputation: 187060

I don't think there will be any issue with your code unless the AJAX function is erroneous. You have to take care of the success and error callbacks of the AJAX function so that there won't be any issue with the loop not being stopped.

Also I think you are constantly polling the server for a response and then doing the appropriate action. You can use Reverse AJAX to do this kind of process.

Upvotes: 3

SpliFF
SpliFF

Reputation: 38976

It's safe. The issue is probably to do with stopTimer not being set as you expect.

Upvotes: 19

Related Questions