每 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 秒返回一次数据

使用异步管道轮询 Observables?

每隔几分钟轮询一次 gps 强度

使用PHP如何做到每隔5分钟的时间,首页会向服务器轮询一次,以便获得最新的数据。

(Win/C#/.Net) Applet 需要每隔一小时轮询一次——关于最佳方法的建议?

Java 和 Spring - 轮询 http 端点,直到服务器完成处理