2014-09-24 91 views
0

所以我投票的東西非常標準如何停止由於超時而導致的輪詢?

(function poll(){ 
    $.ajax({ ... }) 
}); 

...它工作得很好。但是現在,我希望能夠每隔幾秒鐘繼續輪詢,如果兩分鐘後沒有得到迴應,請停止輪詢並提出錯誤。

我該如何做超時?

+0

首先想到的是在高溫範圍的一定程度的每次登錄輪詢當前時間('新的Date()')。然後檢查以前存儲的時間之間的差異,然後再作出決定 – ne1410s 2014-09-24 19:25:27

+0

您可能會感興趣http://stackoverflow.com/questions/3543683/determine-if-ajax-error-is-a-timeout它解釋如何檢查超時錯誤的ajax響應。只需在.success上安排一個新的投票,然後在.error中檢查是否超時錯誤 - 如果是,那麼你去。 – 2014-09-24 19:26:06

回答

1

這樣的事情如何?初始化,跟蹤並重置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(); 
+0

這不會只是每個請求超時?我希望整個輪詢過程在兩分鐘後結束。我可能會讀這個錯誤... timeoutTimestamp給我一點點。 – 2014-09-24 20:22:14

+0

您要求它每隔幾秒繼續輪詢一次。如果您在連續2分鐘的投票請求中沒有得到任何超時,投票將停止。 「always」承諾中的「setTimeout」會將每個響應的下一個輪詢事件排隊,直到2分鐘的超時錯誤。 – deefour 2014-09-24 20:54:41

+0

爲了清楚起見,我更改了'timeoutTimestamp'的名稱。它的職責是存儲可能是一系列超時響應的第一個時間戳。如果收到除「超時」之外的任何響應,則清除「firstTimeoutResponse」。 – deefour 2014-09-24 20:56:34

相關問題