如何封装请求
Posted web-gmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何封装请求相关的知识,希望对你有一定的参考价值。
// 封装请求
import axios from "axios";
import store from "../store";
import * as Types from "../store/mutations-types";
import { Toast } from "cube-ui";
class Ajax {
constructor() {
// 定义一些公共参数
this.baseURL =
process.env.NODE_ENV === "production" ? "www.baidu.com" : "/";
this.timeout = 5000;
this.queue = {}; // 创建一个队列
}
setInterceptors(instance) {
// 请求拦截
instance.interceptors.request.use(
config => {
this.queue.url = config.url;
// 如果队列的长度大于0 就显示正在加载
if (Object.keys(this.queue).length > 0) {
this.toast = Toast.$create({
txt: "正在加载",
time: 0
});
this.toast.show();
}
// 每次请求时候拿到一个终止请求的令牌 存到vuex中
const Cancel = axios.CancelToken;
config.CancelToken = new Cancel(c => {
store.commit(Types.PUSH_TOKEN, c);
});
return config;
},
err => err
);
// 响应拦截
instance.interceptors.response.use(
res => {
// 每次响应之后就从队列里面删除
delete this.queue.url;
if (Object.keys(this.queue).length === 0) {
this.toast.hide();
}
return res.data;
},
err => {
// 每次响应之后就从队列里面删除
delete this.queue.url;
if (Object.keys(this.queue).length === 0) {
this.toast.hide();
}
Promise.reject(err);
}
);
}
request(options) {
let instance = axios.create();
// 设置拦截器
this.setInterceptors(instance);
// 合并一下用户传的参数和默认参数
const config = {
baseURL: this.baseURL,
timeout: this.timeout,
...options
};
return instance(config);
}
}
export default new Ajax();
以上是关于如何封装请求的主要内容,如果未能解决你的问题,请参考以下文章