2014-09-24 1 views
0

Так что я что-то опроса довольно стандартныйКак вы можете прекратить опрос из-за таймаута?

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

... и это хорошо работает. Но теперь, я хочу, чтобы иметь возможность продолжить опрос каждые пару секунд, а затем, если я не получу ответа через две минуты, прекратите опрос и поднимите ошибку.

Как сделать тайм-аут?

+0

Первым делом необходимо записать текущее время ('new Date()') в каждом опросе на некотором уровне повышенной области. Затем проверьте разницу между ранее сохраненным временем до принятия решения. – ne1410s

+0

Возможно, вас заинтересует http://stackoverflow.com/questions/3543683/determine-if-ajax-error-is-a-timeout, в котором объясняется, как проверить ответ ajax для ошибок таймаута. Просто запланируйте новый опрос на .success и в .error проверьте, была ли это ошибка таймаута - если да, то идите. –

ответ

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 меня бросает. –

+0

Вы просили его продолжить опрос каждые несколько секунд. Если вы не получите ничего, кроме тайм-аутов по этим запросам на запросы в течение 2 минут, опрос остановится. Команда 'setTimeout' в' always' обещает очередное событие опроса в каждом ответе до 2 минут ошибок таймаута. – deefour

+0

Я изменил имя этой 'timeoutTimestamp' для ясности. Задача состоит в том, чтобы сохранить временную метку первой в том, что может быть серией ответов таймаута. Если получен ответ, отличный от «тайм-аута», этот 'firstTimeoutResponse' очищается. – deefour