这听起来像是利用 jQuery 的 Deferred 对象的理想场所。
Addy Osmani 和 Julian Aubourg 在 MSDN 上有一篇很棒的文章: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 );
};
然后像这样解决 Deferred
$.getCachedURL( url ).then( successCallback, errorCallback );
因此,如果您希望仅将某些 url 缓存一段时间,我们可以修改现有代码并按照以下方式执行某些操作(请注意,这不是我的想法)
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 );
};
并使用回调:
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)
});
其中回调将返回传统的 jQuery ajax 成功/错误参数data
,textStatus
并且jqXHR
如果你想使用 JSON$.getJSON
而不是$.get
$.get( url ).then( defer.resolve, defer.reject );
$.getJSON( url ).then( defer.resolve, defer.reject );
请注意,您仍然可以使用$.ajax
$.ajax({
url: url,
dataType: 'json',
}).then( defer.resolve, defer.reject );