投票工作多长时间

时间:2013-03-30 22:09:28

标签: javascript jquery asp.net ajax

我正在研究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 个答案:

答案 0 :(得分:10)

顾名思义 Long Polling 意味着长时间投票。

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

以下是实际进程启动的内容,您对服务器上的某些脚本进行ajax调用,在本例中为/path/to/script,您需要使服务器脚本(例如php)足够智能因此,当需要的数据可用时,它只响应请求,脚本应该等待指定的时间段(例如1分钟),如果没有数据可用,最多1分钟,那么它应该返回没有数据。

一旦服务器返回一些东西,在你的回调函数中你再次对同一个脚本进行ajax调用,服务器脚本再次继续该过程。

考虑一个聊天应用程序,以传统的方式,即使没有可用的消息,你也会每隔2秒轮询一次服务器并返回服务器。如果一分钟的服务器没有,那么给你的新消息,你最后在最后一分钟内击中了服务器30次。

现在考虑 长轮询 方式,将服务器脚本设置为等待新消息一分钟。从客户端,您对脚本进行一次ajax调用,并说明下一分钟没有消息到达,服务器将在1分钟后才响应。你在最后1分钟内只打了一次服务器。你能想象 30 Hit Vs 1 Hit

答案 1 :(得分:4)

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

所以如果一个oncomplete处理程序占用特别长,它可能会与下一个调用重叠,从而减慢系统速度或以不可预测的方式解析。

通过在第一个投票完成后明确启动下一个投票,您可以获得较少的常规电话,其优势在于您可以保证一次只能作为一个单位的工作作为副产品。

答案 2 :(得分:2)

有两种方法可以进行长轮询

  1. setInterval Technique
  2.  
    
    
         setInterval(function() {
          $.ajax({
            url: "server",
            success: function(data) {
              //Update your dashboard gauge
              salesGauge.setValue(data.value);
            },
            dataType: "json"
          });
        }, 30000);
    
    
    1. setTimeout Technique
    2. 如果你发现自己处于破坏间隔时间的情况,那么建议采用递归的setTimeout模式:

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

      使用Closure技术,poll成为一个自动执行的JavaScript函数,它首次自动运行。设置三十(30)秒的间隔。对服务器进行异步Ajax调用。然后,最后,递归地设置下一个轮询。

答案 3 :(得分:1)

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

使用常量settimeout类型轮询意味着在第一次请求完成后立即就绪的数据将在下次轮询之前传递,因为服务器与客户端没有连接。

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

Html5也有像websockets这样的新东西来帮助这个领域,所以你可能也想了解它。