如何封装请求

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();

以上是关于如何封装请求的主要内容,如果未能解决你的问题,请参考以下文章

如何封装请求

如何封装请求

如何在只封装异步请求的两个接口中实现同步请求

封装网络请求

App 组件化/模块化之路——如何封装网络请求框架

axios 是如何封装 HTTP 请求的