Поведение setInterval() с 0 миллисекундами в JavaScript

#javascript #setinterval

#javascript #setinterval

Вопрос:

В моем приложении я нашел некоторый код JavaScript, который используется setInterval с 0 миллисекундами, например:

 self.setInterval("myFunction()",0);
  

Очевидно, что это не кажется мне хорошей идеей. Кто-нибудь может сказать мне, каким будет поведение setInterval здесь? («myFunction» выполняет AJAX-вызов на сервер)

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

Ответ №1:

Браузер устанавливает минимальное значение для интервала. Обычно 10 мс, но это может зависеть от браузера. Это означает, что повторяйте это так быстро, как мне разрешено. Спецификация W3C говорит о 4 мс: http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers

Это правильно, но, вероятно, указывает на ошибку проектирования.

РЕДАКТИРОВАТЬ: Кстати, плохая практика передавать строку в setTimeout / setInterval, вместо этого передавайте функцию, поскольку javascript имеет функции первого класса.

Комментарии:

1. Да, я думаю, что тот, кто это сделал, имел в виду вместо этого вызвать setTimeout() . Я изменю это.

Ответ №2:

setInterval(myFunction, 0) вызовы myFunction непрерывно с минимальной задержкой. Это почти как вызов myFunction в бесконечном цикле. За исключением того, что здесь вы можете остановить цикл с помощью clearInterval метода.

Комментарии:

1. @Brad Я подумал, что «за исключением того, что его можно очистить с clearInterval помощью», было важно: P

2. Я думал, что это ошибка, поэтому при выполнении нескольких правок он откатывает одно или что-то в этом роде: P

3. @Joseph, что ты имеешь в виду? Я ничего не редактировал из его ответа, я просто добавил теги кода вокруг соответствующих частей.

4. Неправильно, смотрите Мой ответ, чтобы узнать, почему, и избегайте отвечать на то, чего вы не знаете в будущем, это хуже, чем ничего не говорить, потому что это вводит в заблуждение.

5. должно быть, @Brad был ошибкой, как тогда сказал Нарендра. Оно просто отображается, когда вы удаляете его в истории редактирования.

Ответ №3:

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

 window.setTimeout(myFunction, 10);
  

Поскольку вы используете AJAX, вам вообще не нужно использовать какие-либо таймеры — просто вызовите следующий AJAX-запрос в обратном вызове (событие завершения / успеха) текущего AJAX-запроса.

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

Комментарии:

1. Я считаю, что setTimeout() — это то, что хотел сделать программист, потому что здесь не имеет смысла вызывать сервер несколько раз.

Ответ №4:

Я предполагаю, что в myFunction() существует clearInterval .

По сути, вы установили интервал, который может выполняться как можно чаще. Если браузер, выполняющий JavaScript, действительно доберется до clearInterval части до следующей итерации интервала, тогда все будет в порядке. В противном случае это будет происходить снова и снова.

Используйте setTimeout вместо этого.

Комментарии:

1. Нет clearInterval 🙁 . Я считаю, что это была ошибка кодирования. Я переключусь на setTimeout. Спасибо

Ответ №5:

setInterval с ‘0’ перемещает выполнение кода в конец текущего потока. Код откладывается в сторону, выполняется весь остальной код в потоке, а когда нет кода для выполнения, выполняется побочный код.