如何避免jQuery定期HTTP请求的不连续性?

时间:2013-01-08 21:41:47

标签: ajax http jquery

我是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()调用的所有新数据数组元素,并且由于可能的定时抖动而不包含重复或丢失的数据样本。

4 个答案:

答案 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是异步的,数据总是落后一层。