每 10 秒轮询一次
Posted
技术标签:
【中文标题】每 10 秒轮询一次【英文标题】:Polling every 10 seonds 【发布时间】:2013-05-03 17:54:55 【问题描述】:在下面的代码中,我期望这将创建一个轮询循环,该循环每 10 秒触发一次,以从服务器获取“作业状态报告”。它似乎每秒创建超过 100 个调用。
我从这个优秀的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/秒的速率。有没有办法在调用循环中引入延迟?
【问题讨论】:
好吧,当它完成时,您正在再次调用该函数 - 我认为您对timeout
存在误解
timeout
不会延迟通话;它只是设置请求可以花费的最长时间。我会在done()
中使用setTimeout(UpdateEstimates, 10000)
。
这不是长轮询的意思。您只是想定期轮询。长轮询涉及向服务器打开一个请求,并且服务器保持该请求处于打开状态,直到数据可以返回给客户端。我已经进行了相应的编辑。
我试图避免打开和关闭 TCP 连接。这就是我研究长轮询的原因。我引用的文章说“这意味着在 ajax 调用完成并且(至少)三十 (30) 秒过去之前,我们的 poll 函数不会被再次调用。”所以我对超时有一个错误的理解。
【参考方案1】:
$.ajax 中的超时并没有按照您的实际想法进行。它只是设置该特定调用的超时时间(允许的最大时间)。 您必须将其包装在 setTimeout 函数中。
【讨论】:
或者可选地使用setInterval()
。
setInterval()
将每 10 秒触发一次(或任何设置的时间)。因此,如果您的通话时间超过 10 秒,您可能会有重叠的请求,甚至可能是乱序响应。我不是说不要使用它,只是要理解它会给你带来不同的结果。
好的,我希望不必每次都拆除并打开 TCP 连接。但我想这就是投票不好的原因。不幸的是,WebSockets 还不能用于这个项目。【参考方案2】:
我建议重新触发“完成”挂钩的超时。 通过这种方式,您可以防止重叠请求。
撕掉“超时”参数 - 正如@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);
【讨论】:
以上是关于每 10 秒轮询一次的主要内容,如果未能解决你的问题,请参考以下文章
如何让 observable 立即返回数据,之后每 5 秒返回一次数据
使用PHP如何做到每隔5分钟的时间,首页会向服务器轮询一次,以便获得最新的数据。