攔截器
在開始創建攔截器之前,一定要了解 $q和延期承諾api
出於全局錯誤處理,身份驗證或請求的任何同步或異步預處理或響應的后處理目的,希望能夠在將請求移交給服務器之前攔截請求,並在將請求移交給服務器之前將響應攔截發起這些請求的應用程序代碼-攔截器利用promise api滿足同步和異步預處理的需求。
攔截器是$httpProvider通過將它們添加到$httpProvider.interceptors數組而向其注冊的服務工廠。調用工廠並注入依賴項(如果指定),並返回攔截器。
有兩種攔截器(和兩種拒絕攔截器):
request:攔截器通過http config對象調用。該函數可以自由修改config對象或創建新對象。函數需要config直接返回對象,或者包含config或新config對象的Promise。requestError:當先前的攔截器拋出錯誤或被拒絕解決時,攔截器將被調用。response:攔截器通過httpresponse對象調用。該函數可以自由修改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依賴的模塊中使用。
