使用“隐形”缓存层覆盖Web App的JavaScript代码中的所有ajax调用是不是一种好的或坏的做法?
它类似于(伪代码):
$.prototype.ajax = function(...) {
if( requested URL can be found in localStorage )
return dataFromLocalStorage; // as Deferred
data = invoke original $.ajax;
localStorage.setItem(key, data);
return data; // as Deferred
}
我可以想到一个专家:现有的ajax调用不需要重构,而且一个骗局:未来的开发人员将不会意识到这个功能,因为它将自己伪装成一个常规的ajax调用。
你怎么看?这是一个好习惯,还是应该避免它?答案 0 :(得分:4)
不,像这样覆盖$.ajax
的默认行为不是一个好主意。页面上的其他代码(包括jQuery插件)可能取决于默认行为。
在某些时候,您可能希望获得某些数据的最新版本,如果$.ajax
始终缓存到localStorage
,则无法执行此操作。当处理代码的人(包括你)无法弄清楚为什么他们的AJAX调用会不断返回陈旧数据时,这也可能导致未来的调试问题。
在单独的函数中实现缓存会好得多。这样当你看到像ajaxWithCaching
这样的调用时,很明显会发生一些普通的AJAX调用。
答案 1 :(得分:1)
我不会覆盖任何事情的默认行为!如果您更改$.ajax
的工作方式,当您使用依赖于$.ajax
的正常功能的灯箱插件(或字面上的任何内容)时,您会做什么?
这会严重地适应你。
相反,创建自己的执行缓存的函数,并正常使用$.ajax
。
var cache={}; // Your Cache
function getArticle(id,callback){ // Your caching ajax-wrapping function (requires a callback)
// Require the arguments
if (arguments.length<2) throw "getArticle requires id and callback arguments";
// If the article is cached, pass it to the callback and return
var cachedArticle = id in cache
? cache[id]
: null;
if (cachedArticle) return callback(cachedArticle,true); // cached=true
// If that article isn't in the cache, perform an ajax call to get it
$.ajax({
url: "article.php",
success: function(data,textStatus,jqXHR){
cache[id] = data; // Cache it!
callback(data,false); // Pass it to the callback // cached=false
}
});
return true; // reporting that we launched an ajax request
}
然后使用它,你有一个相当强大的小功能。
var ajaxWasUsed = getArticle(8, function(articleData,wasCached){
console.log("Got Article #8 "+(wasCached?"(from cache)":"(fresh ajax)")+":",articleData);
});