我应该使用以下哪个javascript长轮询代码?

时间:2014-09-05 07:56:35

标签: javascript ajax long-polling

我想使用长轮询。 我谷歌它,发现了许多有用的资源,因为很多,我感到困惑,这是更好的。 以下是两个地方的三个代码片段。

https://gist.github.com/jasdeepkhalsa/4353139

// Long Polling (Recommened Technique - Creates An Open Connection To Server ∴ Fast)
(function poll(){
$.ajax({ 
    url: "server", 
    success: function(data)
             {
            //Update your dashboard gauge
             salesGauge.setValue(data.value);
             }, 
    dataType: "json",
    complete: poll,
    timeout: 30000 
   });
})();

// The setTimeout Technique (Not Recommended - No Queues But New AJAX Request Each Time ∴ Slow)
(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);
})();

https://github.com/panique/php-long-polling/blob/master/client/client.js

function getContent(timestamp)
{
var queryString = {'timestamp' : timestamp};
$.ajax(
{
    type: 'GET',
    url: 'http://127.0.0.1/php-long-polling/server/server.php',
    data: queryString,
    success: function(data){
    // put result data into "obj"
    var obj = jQuery.parseJSON(data);
    // put the data_from_file into #response
    $('#response').html(obj.data_from_file);
    // call the function again, this time with the timestamp we just got from server.php
    getContent(obj.timestamp);
}
}
);
}

我的问题是哪些代码是长轮询最佳做法? 我应该使用哪一个?

提前致谢。

1 个答案:

答案 0 :(得分:3)

第一种方法在我看来更好:

  1. 如果服务器配置为超时超过30000的长轮询,那么第一个服务器将超时断开请求并发送新请求,不会调用success()函数

    (虽然complete()将是,但错误也可以在error()中处理,就像这样

    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
    

    )。 虽然在第二个请求将在30000之后发送,因此您将在客户端具有不可预测的行为(两个请求可以收到相同的答案,因此可以复制数据)。

  2. 如果服务器配置为长轮询小于30000,则客户端的第二种方法数据不会及时更新。

  3. 如果服务器配置为使用30000进行长轮询,那么它应该没有任何区别。

  4. 总结:在第一种方法中,情况是可控制的,而在第二种情况下,并非总是如此。