0

我正在尝试缓存 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;
}

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

感谢您的任何建议。

4

2 回答 2

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 个实时文件,一个不正确的路径(抛出myError)和一个错误的路径,但在端点缓存中有示例数据

DEMO

于 2013-11-09T14:53:25.893 回答
0

只需prevReq变成一个自定义对象,这样您就可以将其用作地图来执行以下操作:

prevReq[endpoint] = newReq;
于 2013-11-09T14:16:59.917 回答