【发布时间】: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 函数不会被再次调用。”所以我对超时有一个错误的理解。