1

我是 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 });
})();

提前致谢。:)

4

2 回答 2

1

要回答 OP 问题:

“完成:轮询”将一遍又一遍地调用该函数。这将导致相当多的带宽,可能的服务器超时,并且如果被足够多的人使用,可能会减慢您的服务器速度。

于 2013-08-09T19:04:28.753 回答
0

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

(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再次执行(当然,除非有不同的事件进入并首先进入事件队列)。

于 2013-08-09T19:04:02.170 回答