2012-05-14 14 views
7

でキャッシュ時間を変更し、私が知りたい は$.ajax()のキャッシュ時間を変更する方法はありますか? たとえば、ajaxが10分で要求した場合、jqueryは前のデータをロードしますが、10分後に要求された場合は新しいデータをロードします。はjqueryの

UPDATE:

我々はJSONデータをキャッシュする必要があるので、私は

+1

サーバー上のキャッシュヘッダーを10分間設定します。 – epascarello

+0

Vincentの答えを読んで、この質問に欠けている重要な情報があるようです。あなたはHTMLリソース上でAJAX呼び出しを行い、その結果をJSONとして期待しているようです - : – hippietrail

答えて

4

jQueryのは、実際にあなたのための要求をキャッシュしませんJSONデータ型でのAjaxを使用する必要があります - あなたはfalsecacheを設定すると、それだけでセットブラウザーやプロキシがキャッシュされた応答を返さないようにするために、いくつかのヘッダーと "cache buster"クエリ文字列変数(例:?_=487262189472)を渡します。

キャッシングを10分にするには、自分で実装するのが簡単です。例えば、

var cacheBuster = new Date().getTime(); 
setInterval(function() { 
    cacheBuster = new Date().getTime(); 
}, 1000 * 60 * 10) 

は、単にあなたの要求(例えば、?_noCache=<cacheBuster>)にクエリ文字列変数にこれを追加します。


編集:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    var startChar = options.url.indexOf('?') === -1 ? '?' : '&'; 
    options.url += startChar + '_noCache=' + cacheBuster; 
}); 
+0

実際にはうまくいかず、依然としてサーバーに新しい要求をフェッチするケースを知っていますか? – vsync

2

これを:このより完全なソリューションを作るために、ここであなたは透過的に、実際のAjax呼び出しに対するすべてのjQueryのAjaxリクエストにcacheBusterを使用する方法の例ですjQueryのDeferredオブジェクトを活用するための理想的な遊び場のようなものです。ここでは、MSDNのアディOsmaniとジュリアンAubourgによって素晴らしい記事があります

:短期でhttp://msdn.microsoft.com/en-us/magazine/gg723713.aspx

が、彼らは特に、この要求は永遠にキャッシュされます、彼らは要求をキャッシュする方法について説明しそこに例があります。その後、

var cachedPromises = {}; 

$.getCachedURL = function(url, callback) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

、あなたは、特定のURLのみを一定時間キャッシュすることにしたいのであれば、我々は既存のコードを変更し、(ノートの線に沿って何かを行うことができ、そのような

$.getCachedURL(url).then(successCallback, errorCallback); 

として繰延を解決

var callback = function() { 
    console.log('callback', arguments) 
} 

var cacheTime = 3600; 

$.getCachedURL('/dynamic/config', callback, cacheTime).then(function() 
{ 
    console.log('success', arguments) 
}, function() 
{ 
    console.log('error', arguments) 
}); 
01:これは私の頭の上)

var cachedPromises = {}; 
var cachedTimeouts = {}; 

$.getCachedURL = function(url, callback, cacheTime) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
     cachedTimeouts[ url ] = setTimeout(function() { 
      clearTimeout(cachedTimeouts[ url ]); 
      delete cachedPromises[ url ]; 
     }, cacheTime); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

、コールバック関数を使用してオフになっていることあなたはJSONは、あなたはまだちょうど$.ajax

を使用することができ $.getJSON代わりの $.get

$.get(url).then(defer.resolve, defer.reject); 
$.getJSON(url).then(defer.resolve, defer.reject); 

ノートを使用したい場合は、コールバックは

に伝統的なjQueryのAjaxの大成功/エラー引数datatextStatusjqXHRを返します

$.ajax({ 
    url: url, 
    dataType: 'json', 
}).then(defer.resolve, defer.reject); 
+0

JSONデータを取得していただきありがとうございます。この関数はJSONデータをコールバックに渡しません。 – MajAfy

+0

私は、返された情報をどのように返すのかを示す追加の例を使用して回答を更新しました。いくつかの構文も修正しましたので、例を再度コピーしてください。 –

+0

コールバックの引数はHTMLでJSONが必要です。 '$ .getCachedURL'関数を変更する必要があります – MajAfy