Я пытаюсь кэшировать ответ 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;
}
Как я могу отредактировать эту функцию до вышеуказанного? Другая проблема заключается в том, что он должен истекать только после первого запроса, поскольку, если конечная точка не отвечает правильно при первом запросе, объект всегда будет пустым и никогда не будет заполнен данными.
Спасибо за любое предложение.
Здесь решение, которое использует объект 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
) и один неправильный путь, но с образцами данных в кеше конечных точек
Просто превратите prevReq
в пользовательский объект, чтобы вы могли использовать его в качестве карты, чтобы сделать что-то вроде этого:
prevReq[endpoint] = newReq;