使用瘦缓存层覆盖jQuery的$ .ajax是个好主意吗?

时间:2014-03-02 19:23:04

标签: javascript jquery ajax local-storage

使用“隐形”缓存层覆盖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调用。

你怎么看?这是一个好习惯,还是应该避免它?

2 个答案:

答案 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);
});