axios原始碼解析 - 響應攔截器
阿新 • • 發佈:2022-05-11
該文章緊接著 axios原始碼解析 - 請求攔截器,簡單的補充下。
業務程式碼如下:
var service = axios.create(); // 響應攔截器 service.interceptors.response.use((response) => { if (response.data.code === 200) { return response.data; } else { return Promise.reject(response.data); } }, (err) => { return Promise.reject(err); });
核心程式碼如下:
// 請求攔截陣列 var requestInterceptorChain = []; this.interceptors.request.forEach(function(interceptor) { requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); }); // 響應攔截陣列 var responseInterceptorChain = []; this.interceptors.response.forEach(function(interceptor) { responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); });var promise; var chain = [dispatchRequest, undefined]; Array.prototype.unshift.apply(chain, requestInterceptorChain); chain = chain.concat(responseInterceptorChain); promise = Promise.resolve(config); while (chain.length) { promise = promise.then(chain.shift(), chain.shift()); } return promise;
多個響應攔截器
主要講多個響應攔截器的執行順序,程式碼如下:
// 第一個響應攔截器 service.interceptors.response.use(fulfilled1, rejected1); // 第二個響應攔截器 service.interceptors.response.use(fulfilled2, rejected2); // 第三個響應攔截器 service.interceptors.response.use(fulfilled3, rejected3); // 根據上述Axios.prototype.request方法,可以知道handlers陣列:[fulfilled1, rejected1, fulfilled2, rejected2, fulfilled3, rejected3] // 所以執行順序:fulfilled1 --> fulfilled2 --> fulfilled3