我是jQuery的新手,希望每隔3秒使用它从服务器检索数据。 Web服务器以JSON格式每3秒发送一次数据。 JSON数据包含数值数组字段{“samples”:[10,15,-7,19,34,...]}。我写了以下jQuery ajax请求,每隔3秒从服务器检索一次数据:
function getData() {
$.ajax({
url : 'http://example.com',
type: 'GET',
success : function(data) {
myData = data.samples;
setTimeout(getData, 3000);
},
dataType : 'json'
});
return myData;
}
但是,由于时序抖动,从服务器发送的数据可能无法每3秒精确更新一次。那么我应该如何编写jQuery ajax请求以避免可能的数据不连续?也就是说,我希望返回的myData包含来自每个getData()调用的所有新数据数组元素,并且由于可能的定时抖动而不包含重复或丢失的数据样本。
答案 0 :(得分:1)
在服务器上发送数据更新的最后时间戳以及其他JSON数组。然后,当需要使用jQuery调用再次请求数据时,请检查时间戳与已有的数据。这将为您提供一种方法,以了解它是否是相同的数据,或者是否已刷新。
答案 1 :(得分:1)
我认为您可能需要传递更多信息。在AJAX中包含另一个带有时间戳的字段“lastUpdate”。您的javascript可以保存它获得的最后时间戳并将其提供给服务器。服务器仅在该时间戳之后响应样本(因此您不会遗漏任何内容),并且如果它仍然是最新的,则不会响应任何内容(因此您不会重复)。
答案 2 :(得分:1)
回归myData
没什么意义。 (a)变量未在函数内声明,(b)数据从服务器异步到达。
目前,getData()
保证(充其量)返回之前迭代获得的数据。
要使用新获得的数据,您需要在myData
函数或success
回调中对done()
执行必要的操作,如下所示:
function getData() {
$.ajax({
url: 'http://example.com',
type: 'GET',
dataType : 'json'
}).done(function(data) {
var myData = data.samples;
//Do whatever is necessary with myData here.
//Call extenal function as necessary to do the job.
setTimeout(getData, 3000);
});
}
答案 3 :(得分:1)
以利用ajax的异步特性的方式编写代码。例如,
var interval;
function handleData(data) {
// I handle the data returned from the ajax request.
console.log(data);
}
function getData() {
// I send the ajax request.
$.ajax({
url: 'http://example.com',
success: handleData,
error: function(){
// on error, stop making requests to help with debugging.
console.log(arguments);
clearInterval(interval);
}
});
}
interval = setInterval(getData,3000);
这将导致在大多数情况下,响应将按顺序进行。你可以在所有情况下都做到这一点,如果你摆脱了间隔,而是在上一次成功后3秒调用获取数据。
function getData() {
// I send the ajax request.
$.ajax({
url: 'http://example.com',
success: handleData,
error: function(){
// on error, stop making requests to help with debugging.
console.log(arguments);
}
});
}
function handleData(data) {
// I handle the data returned from the ajax request.
console.log(data);
setTimeout(getData,3000);
}
getData();
附注:“定时抖动”根本不是抖动,它只是一个逻辑错误。由于Ajax是异步的,数据总是落后一层。