Как делать запросы Ajax каждые 10 секунд (помимо длинных опросов)? - PullRequest
3 голосов
/ 06 ноября 2010

Я пытаюсь получать запрос объекта json от сервера каждые 10 секунд, используя это:

setInterval(function(){
  $.ajax({
    url: '/',
    success: function(data){
      //do stuff with data
    }
  });
}, 10000);

Но это не очень эффективно.Я знаю о длинных опросах, но я не думаю, что это будет иметь большое значение.Я знаю Я буду получать новые данные каждые 10 секунд, поэтому разве это не делает длинный опрос точно таким же, как setInterval, с точки зрения эффективности?

Является ли кэширование на стороне браузера хорошим решением?для этой проблемы?

Объект JSON, который я получу, выглядит следующим образом:

var data =  {1: {'user': 'John', 'age': '25'}, {2: {'user': 'Doe', 'age': '30'}}

При этом я хочу отображать data [0] .user в течение нескольких секунд и послеэто плавно превращает его в data [1] .user, используя 'fadeOut' и 'fadeIn' и так далее, пока не закончатся пользователи.Я в основном хочу создать слайд-шоу с именами пользователей.

Будет ли кэширование хорошим решением или мне следует делать вызовы ajax каждые 10 секунд?Если так, то как бы я это реализовал, а если нет, какой метод я должен использовать?

Я не уверен, объяснил ли я это достаточно хорошо, поэтому скажите мне, если что-то все еще неясно.

Ответы [ 2 ]

6 голосов
/ 06 ноября 2010

Я бы определенно подумал о кешировании.Особенно, если вы получаете наборы с гораздо большим количеством пользователей, выполнение AJAX-запроса каждые 10 секунд может легко перегрузить ваш сервер.Однако, если вы хотите сохранить простоту, делайте запрос каждые несколько минут для обновления.Кэшируйте пользователей, сгенерируйте их в код JavaScript, скажем users = new Array (user1, user2, ...).На самом деле вам не нужно постоянно обновлять страницу, если это не так важно, так как большинство пользователей все равно уйдут через минуту или две.Если у вас длинный список, который меняется каждые несколько секунд, это дает вам достаточно времени, чтобы вам никогда не приходилось обновлять с помощью AJAX, а просто полагаться на сгенерированный сервером список пользователей.

Если нет, сохраните последний разВы обновили список в переменной и отправили время в качестве аргумента на сервер при обновлении через AJAX, а затем попросили сервер быстро проверить, какие новые пользователи были добавлены, и отправить только тех.Затем просто объедините новый массив новых серверов со старым массивом.Я настоятельно рекомендую не звонить каждые 10 секунд для нового имени, хотя.Вы не только увеличите пропускную способность на своем сервере, но и увеличите загрузку ЦП, когда вам нужно будет найти следующего пользователя в списке, а затем отправите вам этого.Для хорошей практики всегда позволяйте клиенту выполнять как можно большую часть работы без задержки.Существует только один сервер, но гораздо больше клиентов.Каждая операция, которую вы переносите на клиентов, будет экономить вашему серверу сотни, если не тысячи операций.

Что касается длинного опроса против setInterval, я бы порекомендовал setInterval в этом случае.Вы можете, по крайней мере, отправить запрос с аргументом времени, указав время последнего обновления, и, следовательно, нужно отправить только эту небольшую часть вместо всего массива данных.

var storage = new Array(user1, user2, ...); //set all your data here, generate it from your server
var lastUpdate = //set the last time you updated it, just create a date variable

function rotateUsers()
{
    //do your fade in and fade out here
}

function update()
{
    //create a new HttpRequest, and then set the url as "yoursite.com/update?lastUpdateTime="+lastUpdate;
    //Take the response data, and merge the new users list with the old one
}
setInterval('rotateUsers()',10000);
setInterval('update()',60000); //update once a minute
0 голосов
/ 06 ноября 2010

Длинный опрос будет лучше, чем setInterval (fn, delay), потому что, по крайней мере, тогда сервер просто отправит вам обновленные данные, когда он будет готов, по сравнению с клиентом, сделавшим такое предположение, а затем сгенерирует запрос данных, которые могут неизменено.

Если у вас есть контроль над технологией клиент / сервер, вы можете передавать данные клиенту без необходимости повторного подключения XHR при каждом нажатии, используя WebSockets

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