我尝试在端点失败或花费太多时间来回复请求时缓存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;
}
如何编辑此功能以达到上述目的? 另一个问题是它应该在第一个请求之后才会超时,因为如果端点在第一个请求中没有正确响应,则该对象将始终为空并且永远不会被数据填充。
感谢您的任何建议。
答案 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 强>