2017-03-16 162 views
3

對於某些http請求,我希望從內存中返回數據,而不是讓它訪問服務器。我知道我可以編寫http攔截器,但我不確定如何實際返回請求的響應?

myModule.factory('myHttpInterceptor', function ($q) { 
    return { 
     // optional method 
     'request': function (config) { 
      // return my data here [200], and stop the call from going through 
      return config; 
     } 
    }; 
}); 
+0

我們在工作中做了什麼,我們是否在總是返回承諾的cacheService中封裝http請求。總結:'return isCachedObject? $ q.resolve(cacheInstance):從httpRequest返回結果。它可以成爲你的選擇嗎? – 2017-03-16 14:51:34

+0

@ÉricRoberge是的,無線工作,但希望有一個更優雅的解決方案:)也許沒有一個! – Chris

+0

另一個選擇是緩存httpRequest的承諾。所以接下來對相同請求的調用可以綁定到第一個調用的承諾。 – 2017-03-16 15:01:58

回答

2

您可以檢查此文章:Caching HTTP

或者你可以使用緩存參數$http(檢查更角documentation):

$http.get('api/path',{ 
    cache: true 
} 
+0

謝謝,但我不想用這種方式使用緩存。對於大數據它會導致瓶頸。 – Chris

+0

那麼,檢查第一個鏈接。 –

5

下面是僅使用攔截器的解決方案。我仍然認爲評論中的Érics解決方案更加優雅,但現在您有不同的選擇需要考慮。

app.factory('myHttpInterceptor', function ($q, myCache) { 
    return { 
     request: function (config) { 
      var cached = myCache.getCachedData(config.params); 
      if(cached){ 
       return $q.reject({cachedData: cached, config: config }); 
      } 
      return config; 
     }, 

     response: function(response){ 
      // myCache.saveData(response.data); 
     }, 

     responseError: function(rejection) {  
      if(rejection.cachedData){ 
       return $q.resolve(rejection.cachedData); 
      } 
      return $q.reject(rejection); 
     } 
    }; 
});