Axios封装及请求防抖

//request.js文件中
import axios from "axios";
//import些你需要的插件或者数据...
let requests=[];//请求防抖需要收集请求中的集合,并控制过滤

/****** 创建axios实例 ******/
const service = axios.create({
  baseURL: process.env.BASE_URL, // 接口基础路径
  timeout: 5000  // 请求超时时间
  // transformResponse 允许自定义原始的响应数据(字符串)
  transformResponse: [function (data) {
    try {// 如果转换成功则返回转换的数据结果return JSON.parse(data)
    } catch (err) {// 如果转换失败,则包装为统一数据格式并返回return data}
  }]
})


/****** request拦截器==>对请求参数做处理 ******/
service.interceptors.request.use(async config => {
    
     // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
    let flag = await stopRepeatRequest(requests, config.url, `${config.url} 请求重复`)
    if (flag) {return}
    if (!config.method) {config.method = "get";}//设置默认请求方式
    try {setConfig(config);} catch (error) {console.error(error);}//预设请求头
    //...此处可以考虑添加一些请求loading样式或者什么的
    return config;
}, error => {//请求错误处理,如结束loading什么的操作等 Promise.reject(error)})
    
    

/****** respone拦截器==>对响应做处理 ******/
service.interceptors.response.use(
    response => {  //成功请求到数据
        //这里根据后端提供的数据进行对应的处理等
        allowRequest(requests, response.config.url)//过滤掉已结束的请求
         if (code === "-9000") {//前后端约定的一些返回处理}
        return response.data;
    },
    error => {  //响应错误处理
       allowRequest(requests, response.config.url)//过滤掉已结束的请求
        if (code === "-9000") {//前后端约定的一些返回处理}
        return Promise.reject(error)
    }
);
// 拦截request,设置全局请求为ajax请求
function setConfig(config, fetch) {
    let headers = {};
    // 用户登录后获取的token
    headers["token"] = config.headers["token"] = electronStore.get("token") || "";
   //预设更多的请求头....
    if (fetch) {
        return headers;
    }
}
//请求中的URL集合
function stopRepeatRequest(reqList, url, errorMessage) {
    if (url.indexOf('upload/uploadChunkFile') != -1 || url.indexOf('api/chat/getUserHistoryMsgs') != -1 || url.indexOf('api/chat/ackUserOffLineMsgs') != -1) {
        return false
    }
    if (reqList.length) {
       let arr= reqList.filter(item=>item==url)
        if(arr.length){
            console.log(errorMessage,49)
            return  true
        }
    }
    reqList.push(url)
}
//单个请求结束后的URL
function allowRequest (reqList, url) {
    if (reqList.length) {
        requests=reqList.filter(item=>item!=url)
    }
};
export default service;

评论

还没有评论...留下你的评论!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Sidebar