Angular js拦截器,返回缓存的响应

时间:2016-04-26 11:49:07

标签: angularjs angular-http-interceptors

我想创建一个angularJS拦截器,当客户端离线时,返回而不是错误的缓存响应,好像它没有任何错误。

到目前为止,我所做的是创建一个缓存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,这样当我检查是否在离线时发出了请求时。

我的问题是如何构建响应? 我应该作出新的承诺还是我可以更新拒绝?

2 个答案:

答案 0 :(得分:0)

将被拒绝的承诺转换为履行承诺返回 onRejection处理程序中的值。

相反,要将履行承诺转换为被拒承诺抛出 onFulfilled处理程序中的值。

有关详细信息,请参阅Angular execution order with $q

答案 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);
 }

所以我做了一个新的承诺并修改了我从缓存中获取新数据的拒绝。