[英]How to make jQuery to continously request the same HTTP GET request
我正在实现一个使用$ .getJSON读取jQuery系统状态的软件。
我的想法是我要在浏览器中显示实时数据,并希望尽可能频繁地更新数据。 该服务器也在本地主机上运行,因此从理论上讲我应该能够获得非常低的延迟(至少<50 ms,甚至少于20 ms)。
但是问题是这样的:我如何用jQuery实现getJSON,以便HTTP GET请求在较早的请求完成后立即自动重新发送?
在当前的实现中,我定义了一个更新函数:
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
// ..parse data here
});
}
并每50毫秒添加一次回调:
document.simulationIntervalId = setInterval( "updateSimulation()", 50 );
问题在于,如果一个请求花费的时间超过50毫秒,则多个请求将异步等待结果,这意味着如果一个请求花费的时间更长,则较旧的数据可能会被较新的数据替换,这是不希望的。
因此,基本上,这意味着可以考虑以下两种解决方案之一:1)当响应到达时,所有挂起的请求都可能被杀死(不是最佳的),2)仅在上一个请求返回后才发送新请求(也许是最佳的)解)。
但是与往常一样,所有评论和答案都非常感谢!
为什么不对成功函数($ .getJSON的第二个参数)调用updateSimulation?
上一个请求完成后,它将执行请求。
首先,在使用setInterval()
或setTimeout()
,请勿将方法作为字符串传递,因为这会调用臭名昭著的eval()
,这是不良的编码实践。 而是这样传递方法: setInterval(updateSimulation, 50);
为了确保ajax请求在发送另一个请求之前已经完成,请使用setTimeout()
仅调用一次updateSimulation()
方法,然后在jquery的ajax成功事件上再次调用updateSimulation()
。
处理完当前window.setTimeout()
后,请改用window.setTimeout()
并重新发出另一个。 这样就不会有重叠 。
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
// ..parse data here
window.setTimeout(updateSimulation, 250);
});
}
根据需要调整时间...
请改用setTimeout,并在先例调用返回时调用它。 返回后将运行50毫秒(顺便说一句,50毫秒对于AJAX来说太小了,请考虑500毫秒或1000)
您还可以将时间戳添加到发送的数据,并将其与上一个已知的超时进行比较
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
window.setTimeout(updateSimulation, 500 );
if (data.sent > last_data_sent){
// use data
last_data_sent = data.sent
}
});
}
您还可以将setInterval与所需的时间段(例如50ms)一起使用,并添加一个指示器以了解上一个请求是否已完成。 该指标不一定必须包含在全局数组中。
function updateSimulation() {
if (!requesting) {
requesting = true;
$.getJSON('/simulation/', function(data) {
requesting = false;
});
}
}
var requesting = false;
setInterval ('updateSimulation', 50);
命名空间是您使用的对象。
2)听起来不错,但50ms有点快。 我不认为服务器会喜欢它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.