美文网首页
2020-04-14 vue axios 拦截请求 全局load

2020-04-14 vue axios 拦截请求 全局load

作者: 追寻1989 | 来源:发表于2020-04-14 15:09 被阅读0次
    /**
     * request.js
     * @description 通过axois的钩子函数,进行统一处理和基本操作
     * */
    
    import axios from "axios";
    import api from "@/base/api";
    // import qs from "qs";
    
    let needLoadingRequestCount = 0
    
    //请求基本设置
    const service = axios.create({
      //withCredentials: true,
      timeout: 5000
    });
    
    //请求前拦截
    service.interceptors.request.use(
      (config, res) => {
        config.headers['token'] = api.loginGetUserSync() && api.loginGetUserSync().token || null;
        // config.headers['Content-Type'] = 'application/x-www-form-urlencoded;'
        return config
      },
      error => {
        return Promise.reject(error || "请求出错");
      }
    );
    
    //请求响应后处理
    service.interceptors.response.use(
      response => {
        const data = response.data;
    
        hideLoading()
    
        //处理后端内部逻辑错误的提示(成功1 失败0)
        if (data.code !== 1) {
          api.toast(data.msg, 'bottom'); //逻辑异常提示
          //如果是401,代表token过期
          if (data.code === 401) {
            //退出登录
            api.loginOut('login')
          }
        }
    
        return Promise.resolve(data);
    
      },
      error => {
    
        const status = error.status;
        const statusMsg = error.statusMsg;
        hideLoading()
    
        errorResponse(status, statusMsg);
    
        return Promise.reject(statusMsg || "获取数据出错啦");
      }
    );
    
    //请求响应后错误处理
    function errorResponse(status, statusMsg) {
      if (status) {
        status = status.toString();
        switch (status) {
          case "401":
            api.toast("登录过期!");
            //退出登录
            api.loginOut('login')
            break;
          case "404":
            api.toast("页面不存在!");
            break;
    
          default:
            api.toast(statusMsg || "未知错误");
            break;
        }
      } else {
    
        if (navigator) {
          if (!navigator.onLine) {
            api.toast("请检查网络是否连接");
          }
        }
    
      }
    
    }
    
    /**
     * 发起请求
     * @param {Boolean} option
     * @param {Boolean} option.isShowLoading 是否显示加载框
     * @param {String} option.url 请求url
     * @param {Object} option.param 传参
     * @return {Promise} then(data) 成功返回data(结果数据)
     * @return {Promise} catch(reason) 失败返回reason(失败原因)
     */
    export default function request(option = {}) {
      if (option.isShowLoading) {
        showLoading(option.loadingMsg);
      }
      return service(option);
    }
    
    
    //showLoading() hideLoading() 要干的事儿就是将同一时刻的请求合并。
    //声明一个变量 needLoadingRequestCount,每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。
    //调用 hideLoading()方法,needLoadingRequestCount - 1。needLoadingRequestCount为 0 时,结束 loading。
    export function showLoading(loadingMsg) {
      if (needLoadingRequestCount === 0) {
        api.showLoading(loadingMsg);
      }
      needLoadingRequestCount++
    }
    export function hideLoading() {
      if (needLoadingRequestCount <= 0) return
      needLoadingRequestCount--
      if (needLoadingRequestCount === 0) {
        api.hideLoading();
      }
    }
    

    相关文章

      网友评论

          本文标题:2020-04-14 vue axios 拦截请求 全局load

          本文链接:https://www.haomeiwen.com/subject/uwctvhtx.html