最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • axios入门级封装以及取消重复请求应用

    正文概述 掘金(depth)   2021-05-27   593

    axios封装以及取消重复请求应用

    封装代码

    // axios.js
    // 封装axios请求,返回重新封装的数据格式
    import axios from 'axios'
    import errHandle from './errHandle'
    
    class HttpRequest {
      constructor(baseUrl) {
        this.baseUrl = baseUrl
      }
    
      getInsideConfig () {
        const config = {
          baseURL: this.baseUrl,
          headers: {
            'Content-Type': 'application/json;charset=utf-8'
          },
          timeout: 10000
        }
        return config
      }
    
      // 设定拦截器
      interceptors (instance) {
        // 添加请求拦截器
        instance.interceptors.request.use((config) => {
            // 如果有token 的话 在header添加token 如果没有(登录的情况)就不传
         if () {
                config.headers.Authorization = JSON.parse(window.localStorage.getItem("Login")).token
         }
            
          return config
        }, (error) => {
          // 对错误的统一处理
          // 对请求错误做些什么
          errHandle(error)
          return Promise.reject(error)
        })
    
        // 添加响应拦截器
        instance.interceptors.response.use((res) => {
          if (res.status === 200) {
            return Promise.resolve(res.data)
          } else {
            return Promise.reject(res)
          }
          // 对响应数据做点什么
        }, (error) => {
          // debugger
          errHandle(error)
          // 对响应错误做点什么
          return Promise.reject(error)
        })
      }
    
      // 创建实例
      request (options) {
        const instance = axios.create()
        const newOptions = Object.assign(this.getInsideConfig(), options)
        this.interceptors(instance)
        return instance(newOptions)
      }
    
      get (url, config) {
        const options = Object.assign({
          method: 'get',
          url
        }, config)
        return this.request(options)
      }
    
      post (url, data) {
        return this.request({
          method: 'post',
          url,
          data
        })
      }
    }
    
    export default HttpRequest
    
    
    // request.js
    import HttpRequest from './axios'
    import config from './../config'
    
    // 根据不同环境 不同的请求url
    const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev
      : config.baseUrl.prod
    
    const axios = new HttpRequest(baseUrl)
    
    export default axios
    

    取消重复请求应用

    开发项目中,在处理长列表点击加载更多,需要考虑到用户网速比较慢的情况,在请求还没有到达之前,如果再次点击加载更多,需要对这种重复请求进行取消。

    axios.js

    const CancelToken = axios.CancelToken
    constructor(baseUrl) {
        this.baseUrl = baseUrl
        this.pending = {} // ++
    }
    // ------------------------- 
    // key 判断是否相同的请求
    // isRequest 判断请求是否已经得到响应
    // this.pending[key] 判断是否发送了
    removePending(key, isRequest = false) {
        if (this.pending[key] && isRequest) {
            this.pending[key]('取消重复请求!')
        }
        delete this.pending[key]
    }
    // ------------------------- 
    // 判断上一次的请求是否有回应 请求拦截器
    instance.interceptors.request.use((config) => {
        const key = config.url + '&' + config.method
        this.removePending(key, true)
        
        // 核心.. 这个 c 个人理解为:调用则会取消此次请求。
        config.cancelToken = new CancelToken(c => {
            this.pending[key] = c
        })
        return config
    },
    
    // -------------------------                
                                      instance.interceptors.response.use((res) => {
        const key = res.config.url + '&' + res.config.method
        this.removePending(key) // 默认 isRequest = false
     
        if (res.status === 200) {
            return Promise.resolve(res.data)
        } else {
            return Promise.reject(res)
        }
        ...
    })
    

    组件中发送请求:

    getList(options).then(res => {
        // ...do sth
    }).catch(e => {
        if (e) {
            this.$alert(e.message)
        }
        // e.message(则是调用上面的c传的参数)
    })
    

    整个流程就是 提交一次请求,此时this.pending[key] 有值,如果用户因为网速问题 (可以在浏览器network修改网速调试) 还没有得到响应,再次点击发送请求的时候,this.pending[key]就会执行this.$alert(e.message) 会被执行 。如果有响应的话,会delete this.pending[key],这样就完成了重复请求的取消,并且对用户进行了提示。


    起源地下载网 » axios入门级封装以及取消重复请求应用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元