#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
помощью», было важно: P2. Я думал, что это ошибка, поэтому при выполнении нескольких правок он откатывает одно или что-то в этом роде: 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’ перемещает выполнение кода в конец текущего потока. Код откладывается в сторону, выполняется весь остальной код в потоке, а когда нет кода для выполнения, выполняется побочный код.