這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰ios
axios有兩種攔截:請求攔截和響應攔截。兩種攔截都有成功和失敗兩種狀態。axios
特別注意,攔截後必定要將請求/響應返回,否則服務器/瀏覽器是收不到請求的。promise
// 添加請求攔截器
axios.interceptors.request.use(function (config) {
// 在發送請求以前作些什麼
return config;
}, function (error) {
// 對請求錯誤作些什麼
return Promise.reject(error);
});
// 添加響應攔截器
axios.interceptors.response.use(function (response) {
// 對響應數據作點什麼
return response;
}, function (error) {
// 對響應錯誤作點什麼
return Promise.reject(error);
});
複製代碼
除了axios,咱們也能夠給新建立的instance添加攔截器。瀏覽器
請求攔截器在發送請求以前執行,響應攔截器在收到請求以前以前執行。也就是在發送請求以前請求攔截器會將config作一些操做再發給服務器,服務器返回response後響應攔截器能夠將response處理後再把數據返回。緩存
知道了攔截的方式,那咱們何時須要去攔截請求呢?服務器
const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函數接收一個 cancel 函數做爲參數
cancel = c;
})
});
cancel();
複製代碼
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 處理錯誤
}
});
// 取消請求(message 參數是可選的)
source.cancel('Operation canceled by the user.');
複製代碼
相同:本質上都是由createInstance()函數建立而成markdown
不一樣:網絡
axios/lib/core/Axios.js
函數
axios/lib/axios.js
源碼分析
首先,咱們要明白,對於請求攔截器
來講,後定義
的攔截器先執行
;而對於響應攔截器
,先定義
的攔截器先執行
。
源碼核心實現:axios/lib/core/Axios.js
舉個栗子:
按順序定義了四個攔截器:
請求攔截1(fullfilled1,rejected1)
請求攔截2(fullfilled2,rejected2)
響應攔截1(fullfilled111,rejected111)
響應攔截2(fullfilled222,rejected222)
requestInterceptorChain=[fullfilled2,rejected2,fullfilled1,rejected1]
responseInterceptorChain=[fullfilled111,rejected111,fullfilled222,rejected222]
chain=[fullfilled2,rejected2,fullfilled1,rejected1,dispatchRequest,undefined,fullfilled111,rejected111,fullfilled222,rejected222]
//promise = promise.then(chain.shift(), chain.shift())每次取出前兩個,
promise執行順序:
(fullfilled2,rejected2)-->(fullfilled1,rejected1)-->(dispatchRequest,undefined)-->(fullfilled111,rejected111)-->(fullfilled222,rejected222)
//最後返回promise,執行的就是請求的回調函數
複製代碼
總的來講,就是請求攔截器-->發送請求-->響應攔截器-->處理數據。
想了解上一篇axios內容,這裏指路:axios入門篇