准确的长轮询示例?

时间:2011-05-05 07:18:47

标签: javascript jquery ajax json long-polling

我已经创建了一个函数,它应该进行长轮询并获取正在被“推送”给我的实时数据。现在我正在测试一个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 个答案:

答案 0 :(得分:3)

这有点像预期的那样。由于您在请求返回后明智地选择触发setTimeout,因此不会出现“重叠”请求。这是一件好事。

无论如何,您可以使用jQuerys“new”延迟ajax对象,这可能更方便一点。

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

注意.always()是全新的(jQuery 1.6)。

修改

示例:http://jsfiddle.net/rjgwW/6/

答案 1 :(得分:2)

我建议将事件更改为:

success: function (data) {
    console.log(data);
},
complete: function () {
    setTimeout(function () { fetchData() }, 5000)
}

在成功和错误之后始终调用complete事件。这样你只需要setTimeout一次,这样更好。

答案 2 :(得分:1)

我会做一些改变

  • method更改为typemethod不是$.ajax的有效参数。这是一个错误
  • 删除contentTypedataType: 'json'就足以拥有这些值
  • 出现错误时执行某些操作。如果需要,请使用错误参数。例如:

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

希望这会有所帮助。干杯