javascript setInterval: перекрываются ли звонки? - PullRequest
14 голосов
/ 10 февраля 2012

Предположим, у меня есть setInterval(PostToServer, 1000);. PostToServer Функция создает пост Ajax, который может занять больше секунды. Итак, что же происходит: второй вызов выполняется, когда первый еще не завершен, или ожидается завершение вызова, прежде чем делать новый?

Ответы [ 3 ]

10 голосов
/ 10 февраля 2012

Javascript является однопоточным (за исключением веб-работников HTML5, которые не связаны с этой проблемой) с очередью событий. Последующий вызов с setInterval() никогда не начнется, пока не будет выполнен предыдущий вызов. Только один может быть активным одновременно.

Когда наступает время для вашего интервала, внутри механизма JS срабатывает таймер, и событие добавляется в очередь событий javascript. Когда текущий выполняемый поток выполнения JS завершается (и не раньше), механизм JS отправляется и извлекает следующее событие из очереди событий и запускает этот поток выполнения JS. Таким образом, два исполняемых пути в JS никогда не будут перекрываться или продолжаться одновременно. Таким образом, два вызова функций из setInterval () никогда не будут перекрываться. Второй не запустится, пока не закончится выполнение первого.

Но, относительно вашего вопроса, это означает, что два интервала из setInterval() никогда не будут перекрываться, но если вы делаете асинхронный вызов ajax на таймере первого интервала и запуск вызова ajax заканчивается сразу , и второй интервал срабатывает до того, как первый асинхронный вызов ajax запустит свою функцию завершения, тогда ваши вызовы ajax будут или могут перекрываться.

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

См. этот пост для получения дополнительной информации об очереди событий JS и о том, как она работает.

8 голосов
/ 10 февраля 2012

Перекрытие вызовов.

setInterval обеспечивает регулярное выполнение функций без ожидания предыдущего результата.

Если вы хотите ожидать ответа, измените метод интервала наПоллер.Когда время истекло И сервер уже ответил, запросите снова.

Поскольку ответ сервера не будет сильно меняться сразу после ответа, вы также можете добавить обработчик setTimeout в функцию обратного вызоваваш метод AJAX.

2 голосов
/ 10 февраля 2012

Да, это совпадает. Вы можете использовать setTimeout в функции PostToServer, чтобы убедиться, что он не перекрывается, но проблема в том, что он выполняет запрос, затем ждет 1 с, а затем снова выполняет запрос. Так что это не работает точно каждую секунду.

Для получения дополнительной информации, смотрите это видео Пола Айриша: http://youtu.be/i_qE1iAmjFg?t=7m46s

...