一、axios 拦截器
axios
拦截器,代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>axios 拦截器</title>
<script src="./node_modules/axios/dist/mine-axios.js"></script>
</head>
<body>
<script>
console.dir(axios);
axios.interceptors.request.use(function one(config) {
console.log('请求拦截器成功 1');
return config;
}, function (error) {
console.log('请求拦截器失败 1');
return Promise.reject(error);
});
axios.interceptors.request.use(function two(config) {
console.log('请求拦截器成功 2');
return config;
}, function (error) {
console.log('请求拦截器失败 2');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器成功 1');
return response;
}, function (error) {
console.log('响应拦截器失败 1');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器成功 2');
return response;
}, function (error) {
console.log('响应拦截器失败 2');
return Promise.reject(error);
});
axios({
method: 'GET',
url: 'http://localhost:3000/posts'
}).then(response => {
console.log(response);
});
</script>
</body>
</html>
二、axios 拦截器的实现过程
axios
拦截器的实现过程,代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>axios 拦截器实现</title>
</head>
<body>
<script>
function Axios (config) {
this.axios = config;
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager(),
}
}
Axios.prototype.request = function (config) {
let promise = Promise.resolve(config);
const chains = [dispatchRequest, undefined];
this.interceptors.request.handlers.forEach(item => {
chains.unshift(item.fulfilled, item.rejected);
});
this.interceptors.response.handlers.forEach(item => {
chains.push(item.fulfilled, item.rejected);
});
while (chains.length > 0) {
promise = promise.then(chains.shift(), chains.shift());
}
return promise;
}
function dispatchRequest (config) {
return new Promise((resolve, reject) => {
resolve({
status: 200,
statusText: 'OK'
});
});
}
let context = new Axios({});
let axios = Axios.prototype.request.bind(context);
Object.keys(context).forEach(key => {
axios[key] = context[key];
});
function InterceptorManager () {
this.handlers = [];
}
InterceptorManager.prototype.use = function (fulfilled, rejected) {
this.handlers.push({
fulfilled,
rejected
})
}
axios.interceptors.request.use(function one(config) {
console.log('请求拦截器成功 1');
return config;
}, function (error) {
console.log('请求拦截器失败 1');
return Promise.reject(error);
});
axios.interceptors.request.use(function two(config) {
console.log('请求拦截器成功 2');
return config;
}, function (error) {
console.log('请求拦截器失败 2');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器成功 1');
return response;
}, function (error) {
console.log('响应拦截器失败 1');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器成功 2');
return response;
}, function (error) {
console.log('响应拦截器失败 2');
return Promise.reject(error);
});
axios({
method: 'GET',
url: 'http://localhost:3000/posts'
}).then(response => {
console.log(response);
});
</script>
</body>
</html>