【问题标题】:Efficient way to long poll in jquery在jquery中进行长轮询的有效方法
【发布时间】:2013-08-09 18:34:22
【问题描述】:

我是 javascript 和 jquery 的初学者,正在寻找一种在 jquery 中进行长轮询的有效方法。 我遇到了这段代码,对属性 complete: 感到困惑。我知道“完整”的使用,但是这段代码会导致递归函数调用吗?

(function poll(){
    $.ajax({ url: "server", success: function(data){
        //Update your dashboard gauge
        salesGauge.setValue(data.value);

    }, dataType: "json", complete: poll, timeout: 30000 });
})();

提前致谢。 :)

【问题讨论】:

  • 是的,它将是递归的。不过,与替代方案相比,我认为长轮询永远不会有效。
  • @KevinB 那你有什么建议呢?
  • 如果在您的情况下实施起来不太难,websockets。
  • @AshwinSurana javascript 不会那样递归。您可能会遇到嵌套范围的问题,但它不会耗尽内存。如果您担心嵌套范围,请将回调替换为 function(){setTimeout(poll,0)}。但只有在需要时才这样做。我什至不确定不这样做会不会有问题。
  • +1 取消投票。问题相当清楚,人们对所问的问题做出了错误的假设,而不是 OP 的错。

标签: javascript jquery ajax long-polling


【解决方案1】:

回答 OP 问题:

"complete: poll" 将一遍又一遍地调用该函数。这会导致相当多的带宽、可能的服务器超时,并且如果被足够多的人使用,可能会降低您的服务器速度。

【讨论】:

  • 如果服务器设置为长轮询,这就是他的问题所在。
【解决方案2】:

您可以通过使用短超时来避免递归,以确保清除当前调用堆栈:

(function poll(){
    $.ajax({
        url: "server",
        success: function(data){
            //Update your dashboard gauge
            salesGauge.setValue(data.value);
        },
        dataType: "json",
        complete: function () {
            setTimeout(poll, 0);
        },
        timeout: 30000
    });
})();

这将执行poll 作为(可能)当前执行清除后的下一个事件。换句话说,jQuery 将执行 complete 回调并从所有内容返回,直到它最终退出其 onreadystatechange 回调,此时 JavaScript 运行时将再次执行 poll(除非有不同的事件进入并进入当然,首先是事件队列)。

【讨论】:

  • 两者之间真的没有相关的区别,是吗?这不像 $.ajax() 调用会调用 poll() 本身。只有当服务器实际响应(或超时)时,才会调用“完成”处理程序,因此无论您在成功函数中调用 poll()、指定 complete: poll 还是使用 setTimeout() 技术,这都是 (基本上)相同的顺序。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多