jQuery缓存基于端点的JSON响应

时间:2013-11-09 14:02:27

标签: jquery json

我尝试在端点失败或花费太多时间来回复请求时缓存JSON响应。

我从以前的Stackoverflow问题到现在都有这个功能。 问题是该函数总是从实际请求中独立地返回先前的请求。由于此函数由多个端点使用,我不仅需要返回先前的请求,而且还要返回我传递给函数的特定端点的先前请求:

var prevReq = $.Deferred().resolve().promise();

function getData(endpoint) {
    var newReq = $.ajax({
        type: "GET",
        url: endpoint,
        timeout: 2000
    }).then(function(data){
        // successful, set previous request to this request
        console.log(prevReq);
        prevReq = newReq;
        return data;
    },function(){
        // it failed, return the previous successful request
        return prevReq;
    });
    return newReq;
}

如何编辑此功能以达到上述目的? 另一个问题是它应该在第一个请求之后才会超时,因为如果端点在第一个请求中没有正确响应,则该对象将始终为空并且永远不会被数据填充。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

只需将prevReq转换为自定义对象,这样您就可以将其用作地图来执行以下操作:

prevReq[endpoint] = newReq;

答案 1 :(得分:0)

以下是使用cacheData对象的解决方案,该对象仅以cacheData[endpoint]

的形式存储数据,而不是承诺
var cacheData={};
function getData(endpoint) {

  var defer=$.Deferred();
    var newReq = $.ajax({
        type: "GET",
        url: endpoint,
        timeout: 2000
    }).then(function(data){
       /* cache latest copy of data*/
       cacheData[endpoint]=data;
        defer.resolve(data)
    },function(xhr,e,txt){
        /* use cache if available, or pass another object if not*/
        var res= cacheData[endpoint] || {myError: 'No data available at at this time'}
        defer.resolve(res);
    });
    return defer;
}

function responseHandler(data){
   if(data.myError){
    /* do something when no data available*/
  }else{
    /* data available to use in your code */
  }
}

getData('data-1.json').then(responseHandler);

我的演示有4个案例...... 2个实时文件,1个不正确的路径(抛出myError)和1个错误路径但在端点缓存中有样本数据

DEMO