2013-05-03 128 views
0

在下面的代码中,我希望这会创建一个轮询循环,每隔10秒就会触发一次以从服务器获取“作业状态报告”。它似乎每秒创造超过100个电话。轮询每10个seonds

我从这个优秀的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'); }); 

}

的调用是非常低的开销,这样我就可以很容易地处理每秒钟更新一次,但我真的不喜欢连续100 /秒的速率非常多。有没有办法在呼叫循环中引入延迟?

+0

以及您再次调用该函数权当它完成 - 我想你的'timeout'是 – 2013-05-03 17:57:21

+0

一种误解'timeout'不耽误通话;它只是设置请求的最大时间。我会在'done()'里面使用'setTimeout(UpdateEstimates,10000)'。 – 2013-05-03 17:58:49

+1

这不是长轮询的意思。你只是试图定期轮询。长时间轮询包括向服务器打开一个请求,服务器持有该请求,直到有数据返回给客户端。我已经相应编辑了。 – 2013-05-03 18:02:36

回答

1

$ .ajax中的超时没有按照你的想法进行。它只是设置特定通话的超时时间(最大允许时间)。 你将不得不在setTimeout函数中包装它。

+2

或者可以选择使用'setInterval()'。 – 2013-05-03 18:00:54

+1

'setInterval()'会每10秒触发一次(或任何设置)。所以如果你的通话时间超过10秒,你可能会有重叠的请求,甚至可能无序的响应。我不是说不要使用它,但只要明白它会给你不同的结果。 – 2013-05-03 18:03:27

+0

好吧,我希望不必每次都拆下并打开TCP连接。但我想这就是投票不好的原因。不幸的是,WebSockets对于这个项目还没有用。 – 2013-05-06 15:01:34

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); 
}