在開始建立攔截器以前,必定要了解 $q和延期承諾apiapi
出於全局錯誤處理,身份驗證或請求的任何同步或異步預處理或響應的後處理目的,但願可以在將請求移交給服務器以前攔截請求,並在將請求移交給服務器以前將響應攔截髮起這些請求的應用程序代碼-攔截器利用promise api知足同步和異步預處理的需求。數組
攔截器是$httpProvider
經過將它們添加到$httpProvider.interceptors
數組而向其註冊的服務工廠。調用工廠並注入依賴項(若是指定),並返回攔截器。promise
有兩種攔截器(和兩種拒絕攔截器):服務器
request
:攔截器經過http config對象調用。該函數能夠自由修改config
對象或建立新對象。函數須要config
直接返回對象,或者包含config
或新config
對象的Promise。requestError
:當先前的攔截器拋出錯誤或被拒絕解決時,攔截器將被調用。response
:攔截器經過http response
對象調用。該函數能夠自由修改response
對象或建立新對象。函數須要response
直接返回對象,或者做爲包含response
或新response
對象的承諾。responseError
:當先前的攔截器拋出錯誤或被拒絕解決時,攔截器將被調用。1 // register the interceptor as a service 2 $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { 3 return { 4 // optional method 5 'request': function(config) { 6 // do something on success 7 return config; 8 }, 9 10 // optional method 11 'requestError': function(rejection) { 12 // do something on error 13 if (canRecover(rejection)) { 14 return responseOrNewPromise 15 } 16 return $q.reject(rejection); 17 }, 18 19 20 21 // optional method 22 'response': function(response) { 23 // do something on success 24 return response; 25 }, 26 27 // optional method 28 'responseError': function(rejection) { 29 // do something on error 30 if (canRecover(rejection)) { 31 return responseOrNewPromise 32 } 33 return $q.reject(rejection); 34 } 35 }; 36 }); 37 38 $httpProvider.interceptors.push('myHttpInterceptor'); 39 40 41 // alternatively, register the interceptor via an anonymous factory 42 $httpProvider.interceptors.push(function($q, dependency1, dependency2) { 43 return { 44 'request': function(config) { 45 // same as above 46 }, 47 48 'response': function(response) { 49 // same as above 50 } 51 }; 52 });
此處有一個坑,在push時,提示未定義攔截器,由於$httpProvider在config 攔截器時,攔截器service 還不能找到,異步
能夠將攔截器service 定義在config依賴的模塊中使用。ide