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 вместо этого.