1. 程式人生 > 其它 >axios原始碼解析 - 響應攔截器

axios原始碼解析 - 響應攔截器

該文章緊接著 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