2014-11-01 105 views
0

如果響應延遲,我不理解從jQuery AJAX請求返回的數據。我運行要求每一秒,如果響應延遲,讓我們說,3秒,AJAX的成功方法稱爲jQuery Ajax - 延遲響應行爲奇怪

    在Chrome的Linux
  • :在一個時四驅響應每隔3或4秒
  • 在Firefox的Linux:一個響應每3或4秒

參見fiddle

HTML:

<div id="result"></div> 

JS:

$(document).ready(function(){ 
    updateData(); 

    function updateData(){ 
     doRequest(); 
     setTimeout(updateData, 1000); 
    } 

    function doRequest(){ 
     $.ajax({ 
      url: '/echo/js/', 
      type : "GET", 
      data: { 
       js: "", 
       delay: 3 
      }, 
      success: function(retVal){ 
       $('#result').append(new Date() + '<br>'); 
      }, 
      error: function(error){ 
       alert("Error in network (" + error.status + ")"); 
      } 
     }); 
    } 
}) 

我可以強制jQuery的運行成功的方法對每個反應,而不是在任何一組,也迫使它運行要求每一秒?謝謝!

+0

爲什麼'ready()'處理程序在'doRequest()'內? – 2014-11-01 11:46:21

+0

你確定成功回調被省略..?順便說一句,你是否真的想每隔100ms發送一次請求(這會是一個性能問題,你的腳本會減慢我的瀏覽器速度),還是你想在前一個請求完成後發送下一個請求。我會建議類似[this](http://jsfiddle.net/9bcxh3hd/1/)。 – 2014-11-01 11:50:28

+0

@T J:準備好了,對不起,錯誤的位置。我每秒都在運行腳本,而不是100ms,是的,我必須這樣做。這是在線數據圖表的更新。 – Ajax 2014-11-01 11:55:43

回答

1

這都是關於緩存。 http://jsfiddle.net/jakecigar/9bcxh3hd/4/殺死緩存。

具有相同參數的獲取請求通常從緩存中獲取。

$(document).ready(function(){ 
updateData(); 

function updateData(){ 
    doRequest(); 
    setTimeout(updateData, 1000); 
} 

function doRequest(){ 
    $.ajax({ 
     url: '/echo/js/', 
     type : "GET", 
     **cache:false,** 
     data: { 
      js: "", 
      delay: 3 
     }, 
     success: function(retVal){ 
      $('#result').append(new Date() + '<br>'); 
     }, 
     error: function(error){ 
      alert("Error in network (" + error.status + ")"); 
     } 
    }); 
} 
}) 
+0

你是我的救星! :) 謝謝! – Ajax 2014-11-05 07:22:56

0

根據您的意見:

<head>

<script> 
    var second_1=0; 
    var second_2=0; 
    var second_3; 
</script> 

在我看來卑微的時候,你應該使用全局變量來存儲second_1second_2然後用響應數據(如second_3) 。

因此,接下來,使用您的響應數據(第3秒)並獲得這些值的平均值。擺脫延遲,並做這樣的事情:

success: function (data) { 
    second_3=data; //whatever part of data it is you are using 
    var my_average = (second_1 + second_2 + second_3)/3; 
    second_1 = second_2; // 2nd second becomes first 
    second_2 = second_3; // and 3rd second becomes second 
} 

我希望這可以幫助。

+0

好主意,但它不能幫助我。防火牆上沒有每秒數據包數。我們必須對數據包計數三秒鐘,然後獲取數字。所以,不,我不能在JS中做數學。 – Ajax 2014-11-01 12:52:30