Ответ 1
Это безопасно. Проблема, вероятно, связана с тем, что stopTimer не устанавливается, как вы ожидаете.
У меня есть часть Javascript, которая проверяет состояние (через вызов AJAX) каждые n секунд. Если это условие истинно, оно перестает проверяться. Я реализовал его следующим образом:
var stopTimer;
var timerId = setInterval(function() {
/* Make Ajax Calls and set stopTimer */
if (stopTimer) {
clearInterval(timerId);
}
}, 10000);
Однако я нахожу неустойчивое поведение: иногда работает, но в других случаях он постоянно проверяет. Я проверил, что (насколько это возможно) в любой части кода нет ошибки.
Поэтому я подозреваю, что вызов clearInterval внутри обработчика setInterval может быть виновником. Это правильно? Можно ли вызвать clearInterval внутри обработчика setInterval?
Благодарим за внимание.
Это безопасно. Проблема, вероятно, связана с тем, что stopTimer не устанавливается, как вы ожидаете.
Я не думаю, что будет какая-то проблема с вашим кодом, если функция AJAX не ошибочна. Вы должны заботиться об успехах и обратных вызовах ошибки функции AJAX, чтобы не возникало никаких проблем с остановкой цикла.
Также я думаю, что вы постоянно проводите опрос сервера для ответа и затем выполняете соответствующие действия. Вы можете использовать Reverse AJAX, чтобы выполнить этот процесс.
Убедитесь, что вы случайно не используете повторное использование одного и того же имени таймера в другом месте вашего кода, что приведет к тому, что вы всегда остановите второй таймер, который будет определен.
Либо дать таймеру уникальное имя, либо охватить его функцией
var timerForAjax = setInterval(function() {
/* Make Ajax Calls and set stopTimer */
if (stopTimer)
{
clearInterval(timerForAjax);
}
}, 10000);
Я был небрежен, чтобы назвать мой таймер interval
и не понял, что создаю два таймера в той же области действия, которые называются interval
. Обвиняемый iOS8 около часа, пока я не понял, что который не имеет к этому никакого отношения.