1

私はjQueryを初めて使用し、3秒ごとにサーバーからデータを取得するために使用したいと考えています。Web サーバーは、JSON 形式で 3 秒ごとにデータを送信します。JSON データには、数値配列フィールド { "samples" : [10,15,-7,19,34,...] } が含まれています。サーバーから 3 秒ごとにデータを取得するために、次の jQuery ajax リクエストを作成しました。

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

4 に答える 4

1

サーバー上でデータが更新された最後のタイムスタンプを他のJSON配列と一緒に送信します。次に、jQuery呼び出しを使用してデータを再度要求するときは、タイムスタンプを既に持っているものと照合します。これにより、同じデータであるかどうか、または更新されているかどうかを知ることができます。

于 2013-01-08T21:49:32.123 に答える
1

私はあなたがより多くの情報を渡す必要があるかもしれないと思います。タイムスタンプ付きの「lastUpdate」という別のフィールドをAJAXに含めます。JavaScriptは、取得した最後のタイムスタンプを保存してサーバーに提供できます。サーバーは、そのタイムスタンプ以降のサンプルでのみ応答し(したがって、サンプルを見逃すことはありません)、サーバーがまだ最新である場合(重複しないように)、何も応答しません。

于 2013-01-08T21:51:23.360 に答える
1

戻る意味はほとんどありませんmyData。(a) 変数が関数内で宣言されていない、および (b) データがサーバーから非同期的に到着する。

現状では、前回の反復getData()で取得したデータを返すことが (せいぜい) 保証されています。

取得したばかりのデータを操作するには、次のように、関数内またはコールバックmyData内で必要なことをすべて行う必要があります。successdone()

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);
    });
}
于 2013-01-08T22:07:03.453 に答える
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 秒後に get 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);
        }
    });
}
function handleData(data) {
    // I handle the data returned from the ajax request.
    console.log(data);
    setTimeout(getData,3000);
}
getData();

補足: 「タイミング ジッター」はジッターではなく、単なる論理エラーです。Ajax は非同期であるため、データは常に 1 セット遅れます。

于 2013-01-08T22:20:48.567 に答える