Точный длинный пример опроса?


Я создал функцию, которая должна выполнять длинный опрос и получать живые данные, которые "проталкиваются" ко мне. Прямо сейчас я тестирую объект json, который отформатирован таким образом, что он будет выглядеть, как только я получу данные. Кажется, как это работает точно до сих пор. Мне просто интересно, что вы об этом думаете? Вы бы его как-то рефакторировали или сделали бы это совсем по-другому?

var url = '../../path_to_script/respondents.json';

function fetchData() {
  $.ajax({
    url: url,
    method: 'GET',
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    cache: false,
    success: function (data) {
        //parseData(data);
        setTimeout(function () { fetchData() }, 5000);
        console.log(data);
    },
    error: function (data) {
        setTimeout(function () { fetchData() }, 5000)
    }

 });

}

С уважением

3 4

3 ответа:

Я бы сделал некоторые изменения

  • изменить method на type, method не является допустимым параметром для $.ajax. Это ошибка
  • удалить contentType, причем dataType: 'json' достаточно иметь эти значения
  • делайте что-нибудь, когда есть ошибка. Используйте параметры ошибки, если они вам нужны. Например:

.

error: function (xhr, status, errorThrown) {
  alert("There was an error processing your request.\nPlease try again.\nStatus: " + status);
}

Надеюсь, это поможет. Ура

Это работает, как и ожидалось. Поскольку вы мудро выбрали, чтобы запустить setTimeout, Как только запрос возвращается, не может быть "перекрывающихся" запросов. Это очень хорошо.

В любом случае, вы можете использовать "новые" отложенные ajax-объекты jQuerys, что, вероятно, немного более удобно.

(function _poll() {
    $.getJSON( url ).always(function( data ) {
        console.log( data );
        _poll();
    });
}());

Примечание: .always() это brandnew (jQuery 1.6).

Edit

Пример: http://jsfiddle.net/rjgwW/6/

Я предлагаю изменить события на:

success: function (data) {
    console.log(data);
},
complete: function () {
    setTimeout(function () { fetchData() }, 5000)
}
Полное событие всегда вызывается после успеха и ошибки. Таким образом, вы будете иметь линию setTimeout только один раз, что лучше.