所以我投票的東西非常標準如何停止由於超時而導致的輪詢?
(function poll(){
$.ajax({ ... })
});
...它工作得很好。但是現在,我希望能夠每隔幾秒鐘繼續輪詢,如果兩分鐘後沒有得到迴應,請停止輪詢並提出錯誤。
我該如何做超時?
所以我投票的東西非常標準如何停止由於超時而導致的輪詢?
(function poll(){
$.ajax({ ... })
});
...它工作得很好。但是現在,我希望能夠每隔幾秒鐘繼續輪詢,如果兩分鐘後沒有得到迴應,請停止輪詢並提出錯誤。
我該如何做超時?
這樣的事情如何?初始化,跟蹤並重置ajax承諾中的輪詢。
var pollingTimer = null, // stores reference to the current timer id
firstTimeoutResponse = null; // stores the start of what might be a series of timeout responses
function poll(){
$.ajax({
// your options here...
}).done(function() {
// reset the "timeout" timer
firstTimeoutResponse = null;
}).fail(function(jqXHR, textStatus) {
// if the failure wasn't a timeout, short-circuit,
// but only after resetting the timeout timestamp
if (textStatus !== 'timeout') {
firstTimeoutResponse = null;
return;
}
// if it was a timeout failure, and the first one (!), init the timeout count
if (firstTimeoutResponse = null) {
firstTimeoutResponse = (new Date).getTime();
}
}).always(function() {
// if 2 min have passed and we haven't gotten a good response, stop polling/chort-circuit
if ((new Date).getTime() - firstTimeoutResponse > 120000) { // 120000ms = 2min
window.clearTimeout(pollingTimer);
return;
}
// queue the next ajax call
pollingTimer = window.setTimeout(poll, 3000); // poll every 3s
});
}
// kick things off!
poll();
這不會只是每個請求超時?我希望整個輪詢過程在兩分鐘後結束。我可能會讀這個錯誤... timeoutTimestamp給我一點點。 – 2014-09-24 20:22:14
您要求它每隔幾秒繼續輪詢一次。如果您在連續2分鐘的投票請求中沒有得到任何超時,投票將停止。 「always」承諾中的「setTimeout」會將每個響應的下一個輪詢事件排隊,直到2分鐘的超時錯誤。 – deefour 2014-09-24 20:54:41
爲了清楚起見,我更改了'timeoutTimestamp'的名稱。它的職責是存儲可能是一系列超時響應的第一個時間戳。如果收到除「超時」之外的任何響應,則清除「firstTimeoutResponse」。 – deefour 2014-09-24 20:56:34
首先想到的是在高溫範圍的一定程度的每次登錄輪詢當前時間('新的Date()')。然後檢查以前存儲的時間之間的差異,然後再作出決定 – ne1410s 2014-09-24 19:25:27
您可能會感興趣http://stackoverflow.com/questions/3543683/determine-if-ajax-error-is-a-timeout它解釋如何檢查超時錯誤的ajax響應。只需在.success上安排一個新的投票,然後在.error中檢查是否超時錯誤 - 如果是,那麼你去。 – 2014-09-24 19:26:06