SourceTermAnalysisSystem_vue/node_modules/web-storage-cache/example/ajax-cache-example/js/ajax-cache.js
2026-05-15 10:22:44 +08:00

132 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(){
/** 1.使用默认配置的缓存存到localStorage中缓存 1 小时.
* $.ajax({
* wsCache: true
* })
*
* 2.自定义:
* $.ajax({
* wsCache: {
* storageType: 'sessionStorage', //缓存到sessionStorage中
* cacheKey: 'XXXX-cmd', // 自定义缓存key, 默认规则参考genCacheKey(options)
* exp: 10 * 60, // 缓存 10 分钟
* version: '1.0.0' // 缓存版本号
* }
* });
*
* Reference:
* 1.https://github.com/SaneMethod/jquery-ajax-localstorage-cache
* 2.http://api.jquery.com/jQuery.ajaxPrefilter/
* 3.http://api.jquery.com/jQuery.ajaxTransport/
*/
var defaultExpires = 60 * 60; //exp: 60 * 60 expires in 1 hour.
var defaultStorageType = 'localStorage';
var wsCacheMap = {
sessionStorage: new WebStorageCache({
storage: 'sessionStorage'
}),
localStorage: new WebStorageCache({
storage: 'localStorage'
})
};
// 启动前手动清除已过期数据
wsCacheMap.sessionStorage.deleteAllExpires();
wsCacheMap.localStorage.deleteAllExpires();
function genCacheKey(options){
var dataString = options.data;
try {
dataString = JSON.stringify(options.data);
} catch (e) {
console.error(e);
}
return options.wsCache.cacheKey || options.url.replace(/jQuery.*/,'') + options.type.toUpperCase() + (dataString || '') + (options.wsCache.version || '1.0.0');
};
$.ajaxPrefilter(function(options) {
if(options.wsCache) {
var storageType = options.wsCache.storageType ? options.wsCache.storageType : defaultStorageType;
var wsCache = wsCacheMap[storageType] || wsCacheMap[defaultStorageType];
if(!wsCache.isSupported()) {
return;
}
try {
var data = options.data && JSON.parse(options.data);
var wsCacheOptions = options.wsCache;
var cacheKey = genCacheKey(options);
var value = wsCache.get(cacheKey);
if (!value){
// If it not in the cache, we store the data, add success callback - normal callback will proceed
if (options.success) {
options.realsuccess = options.success;
}
options.success = function(data) {
var exp = defaultExpires;
if(typeof wsCacheOptions.exp === 'number') {
exp = wsCacheOptions.exp;
}
try {
// TODO :这里应该加上业务逻辑的判断这个请求是否真正成功的请求。
wsCache.set(cacheKey, data, {exp: exp});
} catch(e){
console.log(e);
}
if (options.realsuccess) options.realsuccess(data);
};
}
} catch (e) {
console.error(e);
}
} else {
return;
}
});
/**
* This function performs the fetch from cache portion of the functionality needed to cache ajax
* calls and still fulfill the jqXHR Deferred Promise interface.
* See also $.ajaxPrefilter
* @method $.ajaxTransport
* @params options {Object} Options for the ajax call, modified with ajax standard settings
*/
$.ajaxTransport("+*", function(options){
if (options.wsCache) {
var storageType = options.wsCache.storageType ? options.wsCache.storageType : defaultStorageType;
var wsCache = wsCacheMap[storageType] || wsCacheMap[defaultStorageType];
if(!wsCache.isSupported()) {
return;
}
var cacheKey = genCacheKey(options),
value = wsCache.get(cacheKey);
if (value){
console.log('read from localStorage cacahe!!');
return {
send: function(headers, completeCallback) {
var response = {};
response['json'] = value;
completeCallback(200, 'success', response, '');
},
abort: function() {
console.log("Aborted ajax transport for json cache.");
}
};
}
}
});
})();