SetInterval() с 0 миллисекундами в JavaScript
В моем приложении я нашел код JavaScript, который использует setInterval
с 0 миллисекундами, например:
self.setInterval("myFunction()",0);
Очевидно, для меня это не кажется хорошей идеей. Может ли кто-нибудь сказать мне, что будет поведением setInterval
здесь? ( "myFunction" делает вызов AJAX для сервера)
Я спрашиваю об этом, потому что у меня неправильное поведение в моем приложении. В 90% случаев приложение ведет себя корректно и выполняется ровно один вызов сервера. Однако иногда на сервер поступает несколько вызовов (до сих пор, максимум 48 вызовов), и я почти уверен, что это ошибка этой строки кода.
Ответы
Ответ 1
Браузер задает минимальное значение для интервала. Обычно 10 мс, но это может зависеть от браузера. Это означает, что это повторяется так быстро, как мне разрешено. Спецификация W3C говорит 4ms: http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers
Это правильно, но, вероятно, обнаруживает ошибку проектирования.
РЕДАКТИРОВАТЬ: Кстати, плохой практикой передавать строку в setTimeout/setInterval, передавать функцию вместо этого, поскольку javascript имеет функции первого класса.
Ответ 2
setInterval(myFunction, 0)
непрерывно вызывает myFunction
с минимальной задержкой. Это почти как вызов myFunction
в бесконечном цикле. Кроме того, здесь вы можете остановить цикл, используя метод clearInterval
.
Ответ 3
Чтобы выполнить его только один раз с небольшой задержкой, используйте setTimeOut
вместо:
window.setTimeout(myFunction, 10);
Поскольку вы используете AJAX, вам не нужно использовать какие-либо таймеры вообще - просто вызовите следующий запрос AJAX в Callback (завершение/успешное событие) текущего запроса AJAX.
Отправьте свой текущий код, и мы сможем провести вас дальше.
Ответ 4
Я предполагаю, что в myFunction()
есть clearInterval
.
В принципе, вы устанавливаете интервал, который может происходить как можно чаще. Если браузер, выполняющий JavaScript, фактически добирается до части clearInterval
до следующей итерации интервала, то это будет хорошо. В противном случае это произойдет снова и снова.
Используйте setTimeout
вместо этого.