1

基本的な関数を使用して AJAX リクエストを実行し、JSON を取得しています。

function getData(endpoint) {
    return $.ajax({
        type: "GET",
        url: endpoint
    });
}

問題は、エンドポイントが応答しなくなったり、データの読み込みに時間がかかりすぎたりする場合があることです。この場合、エンドポイントへの前回の呼び出しで取得した最新の JSON を使用する必要があります。

AJAX 応答時間を追跡する方法を探しています。それが所定の時間制限を超えた場合は、前の要求からキャッシュされた JSON 応答を使用します。

jQueryでそれを行うエレガントな方法はありますか?

提案をありがとう

4

4 に答える 4

2

アンソニー・グリスのコメントをサンプルコードで説明しようとしています

var lastResponseData;

function getData(endpoint) {
   return $.ajax({
    type: "GET",
    url: endpoint,
    dataType: 'json',
    timeout: 1000,
    error:function(jqxhr, status){
    if(status==="error"){
      if(lastResponseData!=null){
       //use it
      }
    }
    else
    {
    getData(endpoint); try again
    },
    success:function(data){
     lastResponseData=data;
     //do work
    }

    }
 });
}
于 2013-11-08T16:02:01.687 に答える
1

変数と遅延オブジェクト + タイムアウトにより、これが簡単になります。

var prevReq = $.Deferred().resolve().promise();

function getData(endpoint) {
    var newReq = $.ajax({
        type: "GET",
        url: endpoint,
        timeout: 2000
    }).then(function(data){
        // successful, set previous request to this request
        prevReq = newReq;
        return data;
    },function(){
        // it failed, return the previous successful request
        return prevReq;
    });
    return newReq;
}

getData("1").done(function(data){
    console.log(data);
})

http://jsfiddle.net/Tentonaxe/85HNs/2/

于 2013-11-08T16:11:33.917 に答える
0

AJAX のさまざまな結果を処理する関数が必要ですが、成功した場合は、応答をグローバル オブジェクトに保存し、常にそこからデータを取得する必要があります。

GlobalObj = {};
GlobalObj.response = {};

function getData(endpoint) {
    var data;
    $.ajax({
        type: "GET",
        url: endpoint
   })
   .done(function(){ 
   //store in global object
   })
   .fail(function(){})
   .always( function(){
        data = GlobalObj.response;
        //these methods are asyncronous 
        //here you should assing the value instead of returning
   });
}
于 2013-11-08T15:54:01.707 に答える
0

ブラウザの Cookie に最後の応答を保存できます。

jQuery cookieを見てください。

于 2013-11-08T16:01:19.847 に答える