我正在使用 $。getJSON 实现一个使用jQuery读取系统状态的软件。
我的想法是我在浏览器中显示实时数据,并希望尽可能频繁地更新数据。服务器也在localhost上运行,所以理论上我应该能够获得非常低的延迟(至少<50 ms,甚至不到20)。
但问题是:如何使用jQuery实现getJSON,以便在先前的请求完成后直接自动重新发送HTTP GET请求?
在我目前的实现中,我定义了一个更新函数:
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
// ..parse data here
});
}
每50毫秒添加一次回调:
document.simulationIntervalId = setInterval( "updateSimulation()", 50 );
问题在于,如果请求的时间超过50毫秒,则会有多个请求异步等待结果,这意味着如果一个请求需要更长时间,旧数据可能会被更新的数据替换,这是不可取的。
所以基本上它意味着可以考虑以下两种解决方案之一:1)当响应到达时,所有未决请求都可能被杀死(非最佳),2)新请求仅在前一个请求返回后发送(也许是最佳解决方案)。
但与往常一样,所有评论和答案都非常感谢!
答案 0 :(得分:2)
为什么不在成功函数($ .getJSON的第二个参数)上调用updateSimulation?
它将在上一个请求完成后执行请求。
答案 1 :(得分:2)
首先,在使用setInterval()
或setTimeout()
时,请不要将该方法作为字符串传递,因为这会调用臭名昭着的eval()
,这是一种糟糕的编码习惯。而是通过这样的方法:setInterval(updateSimulation, 50);
要确保ajax请求在另一个请求被发送之前完成,请使用setTimeout()
仅调用updateSimulation()
方法一次,然后在jquery的ajax成功事件中调用{{1}再次。
答案 2 :(得分:1)
使用window.setTimeout()
代替,并在完成当前处理之后重新发出另一个。这样就不会有重叠。
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
// ..parse data here
window.setTimeout(updateSimulation, 250);
});
}
根据需要调整时间......
答案 3 :(得分:1)
使用setTimeout,并在返回先前调用时调用它。它将在返回后运行50 ms(顺便说一下,50 ms对于AJAX而言太小,想想500 ms或1000)
您还可以为发送的数据添加时间戳,并将其与上次已知的超时进行比较
function updateSimulation() {
$.getJSON('/simulation/', function(data) {
window.setTimeout(updateSimulation, 500 );
if (data.sent > last_data_sent){
// use data
last_data_sent = data.sent
}
});
}
答案 4 :(得分:1)
您还可以将setInterval与期望的时间段(例如50ms)一起使用,并添加指示符以了解先前的请求是否已完成。 这个指标不一定是在gobal数组中。
function updateSimulation() {
if (!requesting) {
requesting = true;
$.getJSON('/simulation/', function(data) {
requesting = false;
});
}
}
var requesting = false;
setInterval ('updateSimulation', 50);
其中,命名空间是您使用的对象。
答案 5 :(得分:0)
2)听起来不错,但50ms有点快。我不认为服务器会喜欢它。