【问题标题】:Accurate long polling example?准确的长轮询示例?
【发布时间】:2023-03-31 23:20:01
【问题描述】:

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

 });

}

问候

【问题讨论】:

    标签: javascript jquery ajax json long-polling


    【解决方案1】:

    这按预期工作。由于您明智地选择在请求返回后触发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:我用示例链接更新了答案。该示例还再次包含 setTimeout 以延迟请求。
    • 干杯,虽然它给了我一个错误:Uncaught TypeError: Object # has no method 'always' _polllongPoll.js:4 (anonymous function)。我可能会补充一点,我已经包含了 jQuery 1.6
    【解决方案2】:

    我建议将事件更改为:

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

    完成事件总是在成功和错误之后被调用。这样一来,您将只有一次 setTimeout 行,这样会更好。

    【讨论】:

      【解决方案3】:

      我会做一些改变

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

      .

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

      希望这会有所帮助。干杯

      【讨论】:

      • 感谢您的意见。还认为 contentType 可能有点多余。好主意也使用错误参数,我会这样做。谢谢
      猜你喜欢
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2013-08-08
      • 2011-04-20
      • 2019-05-28
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多