2016-04-26 3 views
0

Я хочу сделать перехватчик angularJS, который, когда клиент отправляется в автономном режиме, вместо ошибки имеет кешированный ответ, как если бы он не был ошибкой.Угловой js-перехватчик, который возвращает кешированный ответ

Что я сделал до сих пор было сделать перехватчик, который кэширует запросы API:

app.factory('httpCachingInterceptor', function ($q, apiCache) { 
return { 

    'response' : function(response) { 
    // cache the api 
    if (response.config.url.indexOf('api/') > 0) 
     apiCache.addApiCache(response.config.url, response.data); 
    return response; 
    }, 

    'responseError' : function(rejection) { 
    if (rejection.status == -1) { 
     // get the data from apiCache 
     // 
     apiCache.getApiCache(rejection.config.url, function(data) { 
     // build a new promise and return it as a valid response 

     }) 
    } 
    return $q.reject(rejection); 
    } 

} 
}) 

Я заметил, что когда офлайн rejection.status -1 так, что когда я проверить, если запрос был выполнен в автономном режиме.

Мой вопрос в том, как я построю ответ? Должен ли я сделать новое обещание или я могу обновить отклонение?

ответ

0

мне удалось заставить его работать так:

'responseError' : function(rejection) { 
    if (rejection.status == -1) { 
     // get the data from apiCache 
     var deferred = $q.defer(); 

     apiCache.getApiCache(rejection.config.url, function(err, data) { 
     if (err || !data) { 
      return deferred.reject(rejection); 
     } 
     rejection.data = data; 
     rejection.status = 200; 
     deferred.resolve(rejection); 
     console.log("Resolve promise with ", rejection); 
     }) 

     return deferred.promise; 
    } 
    return $q.reject(rejection); 
} 

Так я сделал новое обещание и изменил отказ я получил с новыми данными из кэша.

0

Чтобы преобразовать отклоненное обещание к исполненному обещанию return a значение в обработчике onRejection.

И наоборот, чтобы преобразовать выполненное обещание в отклоненное обещание throw a значение в обработчике onFulfilled.

Для получения дополнительной информации см Angular execution order with $q

Смежные вопросы