2013-05-03 1 views
0

В приведенном ниже коде я ожидал, что это создаст цикл опроса, который будет срабатывать каждые 10 секунд, чтобы получить «отчет о статусе задания» с сервера. Кажется, он создает более 100 вызовов в секунду.Опрос каждые 10 секунд

Я получил свое образование от этого отличного article, но я, кажется, неправильно его читаю.

function UpdateEstimates() { 
var request = { jobID: ExportVM.get("ticketID") }; 
var jqxhr = $.ajax({ 
    type: "GET", 
    url: AppGlobals.serverURL + "GetJobStatus", 
    data: request, 
    contentType: "application/json; charset=utf-8", 
    complete: UpdateEstimates, 
    timeout: 10000, 
    dataType: "json" 
}); 
jqxhr.done(function (data) { NewEstimates(data); }); 
jqxhr.fail(function (data) { alert('new estimates request failed'); }); 

}

Вызов очень низкие накладные расходы, так что я могу справиться легко 1 секунду обновления, но мне очень не нравится непрерывной скорости 100/сек очень много. Есть ли способ ввести задержку в цикл вызова?

+0

хорошо вы вызываете функцию еще раз прав, когда он заканчивает - я думаю, что у вас есть недопонимание 'timeout' является –

+0

' timeout' не задерживает вызов; он просто устанавливает максимальное время, которое может потребовать запрос. Я бы использовал 'setTimeout (UpdateEstimates, 10000)' in' done() '. –

+1

Это не то, что подразумевается под длинным опросом. Вы просто пытаетесь опросить регулярно. Длительный опрос предполагает открытие запроса к серверу, а сервер, содержащий этот запрос, открыт до тех пор, пока данные не будут доступны для возврата клиенту. Я отредактировал соответственно. –

ответ

1

таймаут в $ .ajax не делает то, что вы на самом деле думаете. Он просто устанавливает тайм-аут для этого конкретного вызова (максимально допустимое время). Вам придется обернуть это в функцию setTimeout.

+2

Или необязательно используйте 'setInterval()'. –

+1

'setInterval()' будет срабатывать каждые 10 секунд (или независимо от того, для чего он установлен). Таким образом, если ваши вызовы занимают более 10 секунд, у вас могут быть дублирующие запросы и даже, возможно, ответы вне порядка. Я не говорю, что не использую его, но просто понимаю, что это даст вам разные результаты. –

+0

Хорошо, я надеялся не разорвать и открыть TCP-соединение каждый раз. Но я думаю, поэтому опрос не очень хорош. К сожалению, WebSockets еще не пригодится для этого проекта. –

0

Я предлагаю повторно запустить таймаут на «полном» крюке. Таким образом, вы предотвращаете перекрывающиеся запросы.

Отбросить параметр «тайм-аут» - так как объяснение тайм-аута @ tomca32 связано с вопросом, который займет слишком много времени.

Было бы что-то вроде:

function UpdateEstimates() { 
var request = { jobID: ExportVM.get("ticketID") }; 
var jqxhr = $.ajax({ 
    type: "GET", 
    url: AppGlobals.serverURL + "GetJobStatus", 
    data: request, 
    complete: scheduleUpdEstimates, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 
jqxhr.done(function (data) { NewEstimates(data); }); 
jqxhr.fail(function (data) { alert('new estimates request failed'); }); 


function scheduleUpdEstimates(){ 
    setTimeout(function(){ UpdateEstimates(); }, 10000); 
}