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

Можно ли вызвать clearInterval внутри обработчика setInterval?

У меня есть часть Javascript, которая проверяет состояние (через вызов AJAX) каждые n секунд. Если это условие истинно, оно перестает проверяться. Я реализовал его следующим образом:

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

    /* Make Ajax Calls and set stopTimer */

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

Однако я нахожу неустойчивое поведение: иногда работает, но в других случаях он постоянно проверяет. Я проверил, что (насколько это возможно) в любой части кода нет ошибки.

Поэтому я подозреваю, что вызов clearInterval внутри обработчика setInterval может быть виновником. Это правильно? Можно ли вызвать clearInterval внутри обработчика setInterval?

Благодарим за внимание.

4b9b3361

Ответ 1

Это безопасно. Проблема, вероятно, связана с тем, что stopTimer не устанавливается, как вы ожидаете.

Ответ 2

Я не думаю, что будет какая-то проблема с вашим кодом, если функция AJAX не ошибочна. Вы должны заботиться об успехах и обратных вызовах ошибки функции AJAX, чтобы не возникало никаких проблем с остановкой цикла.

Также я думаю, что вы постоянно проводите опрос сервера для ответа и затем выполняете соответствующие действия. Вы можете использовать Reverse AJAX, чтобы выполнить этот процесс.

Ответ 3

Убедитесь, что вы случайно не используете повторное использование одного и того же имени таймера в другом месте вашего кода, что приведет к тому, что вы всегда остановите второй таймер, который будет определен.

Либо дать таймеру уникальное имя, либо охватить его функцией

var timerForAjax = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

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

Я был небрежен, чтобы назвать мой таймер interval и не понял, что создаю два таймера в той же области действия, которые называются interval. Обвиняемый iOS8 около часа, пока я не понял, что который не имеет к этому никакого отношения.