JQuery Ajax 长轮询 - “在 ajax 调用完成并且(至少)三十 (30) 秒过去之前,轮询函数不会再次被调用”

use*_*171 3 ajax jquery long-polling

我正在考虑对网站上的“通知”系统进行长时间轮询。我以前从未这样做过,因此我正在网上寻找有关它的信息。我正在看这里:http ://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

在关于长轮询的部分中,它说:“超时:为请求设置超时(以毫秒为单位)。超时时间从进行 $.ajax 调用时开始。这里,我们将超时设置为 30 秒。这意味着在 ajax 调用完成并且(至少)三十 (30) 秒过去之前,我们的 poll 函数不会再次被调用。”

说 poll 不会被调用,直到 ajax 调用完成并且至少过去了 30 秒。

当我将其添加到 Javascript 中时,poll 会在 ajax 调用完成时被一遍又一遍地调用。它不会等待 30 秒。

(function poll() {

         $.ajax({ url: "/myapp/messages/messages/checkMessages", success:
         function(data){alert("YO");}, complete: poll, timeout: 30000 });

    })(); 
Run Code Online (Sandbox Code Playgroud)

我是否做错了什么,或者这就是轮询的工作时间?

另外,这样有效率吗?这会随着网站流量而扩展吗?

谢谢您的帮助!

(function poll(){
           setTimeout(function(){
              $.ajax({ url: "/myapp/messages/messages/checkMessages", success: function(data){
                  console.log("Polling!");
              }, complete: poll, timeout: 30000});
          }, 30000);
        })();
Run Code Online (Sandbox Code Playgroud)

sdk*_*900 5

设置呼叫超时$.ajax只会设置呼叫的最大超时时间。

即,如果第一次调用$.ajax未在超时时间内完成,则将再次调用 poll。否则,如果调用完成,poll将再次调用。poll如果在超时时间之前完成,这将导致重复调用。

下面将其包装poll在 setTimeout 中,停止poll重复调用自身(正如您上面所做的那样)

(function poll(){
    setTimeout(function(){
        $.ajax({ url: "/myapp/messages/messages/checkMessages", success: function(data){
            console.log("Polling!");
        }, complete: poll, timeout: 30000});
    }, 30000);
})();
Run Code Online (Sandbox Code Playgroud)

*注意:我为任何寻求更清晰的人添加了答案。