我是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 });
})();
提前致谢。 :)
答案 0 :(得分:1)
回答OP问题:
“complete:poll”将一遍又一遍地调用该函数。这将导致相当多的带宽,可能的服务器超时,如果有足够的人使用可能会降低服务器速度。
答案 1 :(得分: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
(除非另有事件当然,他首先进入了事件队列。