4

我正在研究 ajax 长轮询,但我很困惑。传统的 ajax 调用和长轮询有什么不同

   var lpOnComplete = function(response) {
   alert(response);
   // do more processing
   lpStart();
  };

    var lpStart = function() {
    $.post('/path/to/script', {}, lpOnComplete, 'json');
    };

    $(document).ready(lpStart);

这个例子只是以递归方式调用服务器..与 setInterval 中的传统调用有什么不同..

4

4 回答 4

10

顾名思义,长轮询意味着长时间轮询某事。

$.post('/path/to/script', {}, lpOnComplete, 'json');

这是实际过程的开始,您对服务器上的某个脚本进行 ajax 调用,在这种情况下/path/to/script,您需要使服务器脚本(php例如)足够智能,以便它仅在所需数据可用时响应请求,脚本应该等待指定的时间段(例如 1 分钟),如果在 1 分钟内没有可用数据,则它应该返回没有数据。

一旦服务器返回某些内容,在您的回调函数中,您再次对同一脚本进行 ajax 调用,服务器脚本再次继续该过程。

Consider a chat application, In conventional way you are polling the server say every 2 second's and the server return's even if no messages are available.If upto one minute server get's no new messages for you, you end up hitting the server 30 times in last one minute.

Now consider Long Polling way, you set your server script to wait for one minute for the new messages. From the client, you make a single ajax call to your script and say no messages are arriving for next one minute, server will not respond until 1 minute. And you have hit the server just one time in last 1 minute. Can you imagine 30 Hit Vs 1 Hit

于 2013-03-31T05:16:20.050 回答
4

从理论上讲,使用 setinterval,您可以进行重叠处理,

因此,如果一个 oncomplete 处理程序花费的时间特别长,它可能会与下一次调用重叠,从而减慢系统速度或以不可预知的方式解决。

通过在第一个民意调查完成后明确开始下一次民意调查,您可以获得较少的常规电话,其优势是您可以保证一次只作为一个工作单元作为副产品进行。

于 2013-03-30T22:14:12.323 回答
2

There are two ways to do long polling

  1. The setInterval Technique
 


     setInterval(function() {
      $.ajax({
        url: "server",
        success: function(data) {
          //更新您的仪表板仪表
          salesGauge.setValue(data.value);
        },
        数据类型:“json”
      });
    }, 30000);

  1. setTimeout 技术

如果您发现自己处于要破坏间隔时间的情况,那么建议使用递归 setTimeout 模式:



    (函数轮询(){
       设置超时(函数(){
          $.ajax({ url: "服务器", 成功: 函数(数据){
            //更新您的仪表板仪表
            salesGauge.setValue(data.value);

            //递归设置下一次轮询
            轮询();
          },数据类型:“json”});
      }, 30000);
    })();

Using the Closure technique, poll becomes a self executing JavaScript function that runs the first time automatically. Sets up the thirty (30) second interval. Makes the asynchronous Ajax call to your server. Then, finally, sets up the next poll recursively.

于 2016-08-20T14:46:21.510 回答
1

对于长轮询,除非数据准备好,否则服务器不会返回,否则它将保持网络连接打开,直到数据准备好,在该阶段它可以“推送”到客户端,因为客户端已经在等待。维基百科有一个很好的解释。http://en.wikipedia.org/wiki/Long_polling#Long_polling。在您的示例中, lponcomplete 可能不会在几分钟内被调用。

使用常量 settimeout 类型轮询意味着在您的第一个请求完成后立即准备好的数据将在您的下一次轮询之前不会被传递,因为服务器没有连接到客户端。

对于服务器来说,长轮询会长时间保持套接字打开,占用资源,而重复的短轮询会导致更多的网络流量。

Html5 也有新的东西,比如 websockets 来帮助这个领域,所以你可能也想了解一下。

于 2013-03-30T22:39:57.413 回答