2017-06-21 44 views
1
取消

我的Ajax代碼是Ajax調用有時是由鉻

var auto_refresh = setInterval(function() { 
    $.ajax({ 
      type: 'post', 
      url: 'lib/nav.php', 
      data: 'c=autchk', 
      success: function (result) { 
       $('#test-div').html(result); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       // I don't know how to display error message 
       console.log('Error: '+jqXHR+' '+textStatus+' '+errorThrown); 
      } 
     }); 
}, 9000); 

請求有時會取消之前到達超時。 在Chrome日誌中,取消請求的狀態將停止。然後,我讀了導致我的解釋

排隊。瀏覽器隊列請求時:

  • 有較高優先級的請求。
  • 已經有6個TCP 連接爲此來源打開,這是限制。僅適用於 HTTP/1.0和HTTP/1.1。

失速。由於排隊中描述的任何原因,請求可能會停止。

問題是因爲那還是別的?

編輯:

我測試在3個瀏覽器

的代碼,我沒有看到微軟邊緣任何取消的請求。 Chrome比Firefox更多。

+0

在瀏覽器Ajax請求你有侷限性,它是依賴於瀏覽器,例如用於Chrome瀏覽器是約8 Ajax請求在一個週期時間 。請以寫入方式讓你使用ajax請求。 –

+0

@Farhad然後如何修復我的代碼,以便Chrome不會取消我的請求? – Aidin

+0

爲什麼你想使用超時! 。請解釋更多關於你打算用那個ajax做什麼 –

回答

0

所有瀏覽器上的併發調用同一產地適用限制,已經有上有一個很好的討論:Max parallel http connections in a browser?

的事情是,你實現自動刷新以錯誤的方式, 你是什麼使用被稱爲:Polling,你基本上定期打電話給服務器,但有時可能發生,你已經有其他人打電話進行中,這將導致取消。

輪詢是一種非常古老的方式,您應該看看WebSocket s或Server Side Events,這絕對是處理服務器端更改並將其反映到UI中的最佳方式。

如果你不能實現它們,那麼,你可能需要Long Polling Strategy這是一個古老但仍然有價值的方法。

這裏有其它信息:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

function auto_refresh(onSuccess, onError, onEnd, rate, times) { 
 
    onSuccess = onSuccess || $.noop; 
 
    onError = onError || $.noop; 
 
    onEnd = onEnd || $.noop; 
 
    
 
    rate = Number(rate) || 9000; 
 
    times = Number(times) || Infinity 
 
    
 
    function iteration() { 
 
    return $ 
 
     .post('lib/nav.php', 'c=autchk') 
 
     .then(onSuccess) 
 
     .fail(onError) 
 
     .always(function() { 
 
     if(Number.isFinite(times)) { 
 
      times -= 1; 
 

 
      if(times <= 0) { 
 
      return onEnd(); 
 
      } 
 
     } 
 

 
     return auto_refresh(onSuccess, onError, onEnd, rate, times); 
 
     }) 
 
    ; 
 
    } 
 
    
 
    return window.setTimeout(iteration, rate); 
 
} 
 

 

 
auto_refresh(function(result) { 
 
    return $('#test-div').html(result).promise(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

我會在我的下一個項目中實施您的建議,但現在也許我會堅持這項技術。謝謝... – Aidin

+0

然後你最終得到一些取消,但是,另一個要記住的是**有時服務器沒有什麼要說的**,但客戶端將繼續調用,這將消耗不必要的資源(帶寬,計算時間等),並會嚴重影響您的表現。 – Hitmands

+0

你也可以調整你的代碼考慮我最後的編輯(我添加了一個片段)。 – Hitmands