2012-01-22 8 views
0

jQuery Deferredの使用に関して、this questionの先頭の答えを読んでいます。jQuery deferred ajax cache

IDの配列をループしています。各IDについて、それに関連するデータをajaxリクエストから取得するか、ajaxリクエストがすでにデータを正常に戻していた場合はキャッシュから取得する必要があります。

各ループで、$ .when()を使用して、getData()がそのIDを処理する前に、キャッシュまたはAjax呼び出しが成功したかどうかを確認します。現在の問題は、getData()のajaxが成功するのを待たずに、IDの処理がとにかく進むことです。

いくつかの擬似コード:

var IDs = ["1", "2", "1", "3", "1"]; 
//ID "1" is repeated 
//data for "1" should should require ajax get the first time 
//subsequent processing should get data for "1" from dataCache 

var dataCache = []; 

function getData(ID){ 
    if (/*data for ID in dataCache*/){ 
     //return data pertaining to ID from dataCache 
    } else { 
     return $.getJSON("returnJSONDataByID/" + ID, function(resp){ 
      //push resp data to dataCache 
     }) 
    } 
} 

for (/*each item i in IDs*/){ 
    $.when(getData(IDs[i])).then(function(){ 
     //process IDs[i] data 

     //this is the resolved handler, which should be executed 
     //when either getData() returns data from the dataCache, 
     //or $.getJSON succeeds 
     //PROBLEM: this is currently executing every loop and 
     //and doesn't wait for the ajax to return resp 
    }) 
} 

答えて

5

問題は、あなたのループはすぐにすべてのgetDataのコールを発射するということですが、あなたの結果はのみJSON呼び出しが戻る一度キャッシュに格納されています。したがって、キャッシュはループ内のすべての呼び出しでまだ空であり、それぞれは新しいJSON要求を実行します。

解決策:結果の代わりにDeferredオブジェクトをキャッシュに保存します。

var IDs = ["1", "2", "1", "3", "1"]; 

var dataCache = {}; 

function getData(id) { 
    if (id in dataCache) { 
     console.log("Cache hit for ID " + id); 
     return dataCache[id]; 
    } else { 
     console.log("Retrieving data for ID " + id); 
     var deferred = $.getJSON("http://jsfiddle.net/echo/jsonp/?callback=?", { 
      id: id 
     }, function(response) { 
      console.log("Retrieved data for ID " + id); 
     }); 
     dataCache[id] = deferred; 
     return deferred; 
    } 
} 

for (var i=0; i<IDs.length; i++) { 
    $.when(getData(IDs[i])).then(function(result) { 
     console.log("result: " + result.id); 
    }); 
} 

注:これは作業コードです。play with it in jsFiddleです。

+0

私はこの問題に直面しており、あなたのソリューションはそれを解決して24時間です。 ありがとう – Stormsson

関連する問題