Использование setInterval () для упрощенного непрерывного опроса - PullRequest
30 голосов
/ 30 декабря 2011

Для простого веб-приложения, которому необходимо обновлять части данных, представляемых пользователю через заданные интервалы, есть ли недостатки в использовании setInterval () для получения JSON из конечной точки вместо использования надлежащей структуры опроса?

Для примера скажем, что я обновляю статус задания обработки каждые 5 секунд.

Ответы [ 4 ]

48 голосов
/ 30 декабря 2011

Из моего комментария:

Я бы использовал setTimeout [документы] и всегда вызывал его, когда был получен предыдущий ответ,Таким образом, вы избежите возможной перегрузки или стекирования функций или того, что вы хотите вызвать, в случае, если запрос / ответ занимает больше времени, чем ваш интервал.

Так что-то вроде этого:

function refresh() {
    // make Ajax call here, inside the callback call:
    setTimeout(refresh, 5000);
    // ...
}

// initial call, or just call refresh directly
setTimeout(refresh, 5000);
9 голосов
/ 20 августа 2016

Простая неблокирующая функция опроса может быть реализована в последних браузерах с помощью Promises:

var sleep = time => new Promise(resolve => setTimeout(resolve, time))
var poll = (promiseFn, time) => promiseFn().then(
             sleep(time).then(() => poll(promiseFn, time)))

// Greet the World every second
poll(() => new Promise(() => console.log('Hello World!')), 1000)
2 голосов
/ 18 декабря 2013

Вы можете сделать так:

var i = 0, loop_length = 50, loop_speed = 100;

function loop(){
    i+= 1; 
    /* Here is your code. Balabala...*/
    if (i===loop_length) clearInterval(handler);
}

var handler = setInterval(loop, loop_speed);
1 голос
/ 13 июня 2013

Я знаю, что это старый вопрос, но я наткнулся на него, и в способе StackOverflow я думал, что смогу его улучшить.Возможно, вы захотите рассмотреть решение, аналогичное , которое описано здесь , которое известно как длинный опрос.ИЛИ другим решением является WebSockets (одна из лучших реализаций веб-сокетов с основной целью работы во всех браузерах) socket.io .

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

Между тем, на бэкэнде вы не возвращаете ответ, пока статус не изменится.Таким образом, в вашем сценарии вы будете использовать цикл while, который будет продолжаться до тех пор, пока статус не изменится, а затем вернет измененный статус на страницу.Мне очень нравится это решение.Как показано в ответе, указанном выше, это то, что Facebook делает (или, по крайней мере, делал в прошлом).

socket.io - это в основном jQuery для Websockets, так что любой браузер, в котором находятся ваши пользователи, вы можете установить.сокетное соединение, которое может выдвигать данные на страницу (без опроса вообще).Это ближе к мгновенным уведомлениям Blackberry, которые - если вы собираетесь на мгновение, это лучшее решение.

...