准确的长轮询示例?

5

我写了一个函数,应该可以进行长轮询并获取实时数据,这些数据是被“推送”给我的。现在我正在针对一个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个回答

3

这个功能的表现符合预期。由于您明智地选择在请求返回后触发setTimeout,因此不会出现“重叠”请求。这是一件好事。

无论如何,您可以使用jQuery的“新”延迟ajax对象,这可能会更加方便。

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

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

编辑

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


好的,有趣,我显然不太了解jQuery 1.6。 不过,setTimeout那个,你还会以同样的方式继续使用吗? - Tim
我尝试了你的例子,但是我无法真正让它工作。你可以发一个例子给我看看吗?谢谢。 - Tim
@Tim:我更新了答案,并附上了一个示例链接。该示例还包含了一个setTimeout来延迟请求。 - jAndy
虽然它给了我一个错误:Uncaught TypeError: Object #<XMLHttpRequest> has no method 'always',但还是感谢。我想补充一下,我已经包含了jQuery 1.6。 - Tim

2
我建议将事件更改为:
success: function (data) {
    console.log(data);
},
complete: function () {
    setTimeout(function () { fetchData() }, 5000)
}

完整事件总是在成功和错误之后调用。这样你只需要一次setTimeout行,这更好。

1

我会做一些更改

  • method更改为typemethod不是$.ajax的有效参数。这是一个错误
  • 删除contentType,使用dataType: 'json'就足以拥有这些值
  • 当出现错误时采取一些措施。如果需要,可以使用错误参数。例如:

.

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

希望这能有所帮助。干杯!

感谢您的输入。我也在想contentType可能有点多余了。使用错误参数是个好主意,我会这么做的。谢谢。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接