JQuery кеш JSON ответ на основе конечной точки

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;
}

Как я могу отредактировать эту функцию до вышеуказанного? Другая проблема заключается в том, что он должен истекать только после первого запроса, поскольку, если конечная точка не отвечает правильно при первом запросе, объект всегда будет пустым и никогда не будет заполнен данными.

Спасибо за любое предложение.

Теги:

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

0

Просто превратите prevReq в пользовательский объект, чтобы вы могли использовать его в качестве карты, чтобы сделать что-то вроде этого:

prevReq[endpoint] = newReq;
  • 0
    Ок, круто, но это не решает проблему тайм-аута по первому запросу. Мне нужно как-то заполнить эти данные, прежде чем
  • 0
    Если вы хотите добавить тайм-аут только после первого запроса, вы можете сделать что-то вроде этого (вам нужно начальное значение, здесь предполагается, что значение равно нулю): var opts = {type: "GET", url: endpoint}; if (prevReq [endpoint]! = null) opts ["timeout"] = 2000; var newReq = $ .ajax (опция) ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню