详解如何消除axios拦截中的if

 更新时间:2022年04月17日 09:59:15   作者:科目三后吃饭  
在使用vue的开发中,我们会使用axios来做前后端通信,那这时候我们就需要对请求前后做拦截,下面这篇文章主要给大家介绍了关于如何消除axios拦截中if的相关资料,需要的朋友可以参考下

基本拦截

axios的响应错误拦截中,难免会对error.status做各种各样的if判断,又或者switch。为了防止枯燥乏味的生活(给自己挖坑,换一种姿势去写拦截

// 以下大概是日常碰到的操作,拦截响应,判断status做相应操作
function login () {
  console.log('登陆逻辑')
  return promise.reject(error)
}
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response;
}, function (error) {
  if (error.status === 401) {
    // 401重新登录
    console.log('未登陆')
    return login(error)
  } else if (error.status === 404) {
    console.log('404-什么都没')
    return promise.reject(error)
  } else if (error.status === 422) {
    console.log(error.response.data.message)
    return promise.reject(error)
  } else if (error.status === 500) {
    console.log('服务器内部错误')
    return promise.reject(error)
  } else {
    // 其他请求,直接抛出让业务去处理
    return promise.reject(error)
  }
});

设计轮子

思考方向

首先思考下怎么实现这个东西

  • 需要一个在内部消化if的逻辑判断
  • 根据判断去执行相应的逻辑,意味着我们要在内部维护一个逻辑数组(以下称为管道数组),配合成功后即触发对应管道。所以在开始调用函数去执行前,先要收集好管道。这个方法需要传一个标记(用来判断是否匹配)和回调函数(匹配成功后的逻辑)
  • 除了传标记,需要传一个payload(例如拦截中的error)参数,payload可以让我们在回调函数做出更多的对应操作
  • 在最后再添加一个default函数来收集匹配失败后的函数。

现在,已经在心中拟好了一个小轮子的五脏六腑。

轮子骨架

// 定义个一个class
class Enterclose {
  constructor () {
    // 维护管道数组
    this.pond = {}
    // 默认管道
    this._default = null
  }
  /**
   * 收集管道
   * callback(payload)
   * @param {any} sign 标记
   * @param {Function|Object} callback 回调函数|函数this
   * @return this
   * */
  use (sign, callback) {
    return this
  }
  /**
   * 收集匹配失败的管道
   * callback(payload)
   * @param {Function} callback 回调函数|函数this
   * @return this
   * */
  default (callback) {
    this._default = callback
    return this
  }
  /**
   * 执行管道流
   * @param {any} sign 标记
   * @param {any} payload
   * @return
   */
  start (sign, payload) {
  }
}

详细实现

以上把基本的api骨架写好,然后再一个一个慢慢实现内部的逻辑。

首先是use,用来收集管道,需求中标记是唯一的,所以我们的this.ponds的结构是{标记: callback}

use (sign, callback) {
    this.ponds[sign] = callback
    return this
}

其中我们需要一个方法用来启动Enterclose

通过getCallback函数去筛选和标记匹配的管道,返回对应的函数。这样一个消除if的小轮子就搞好啦

start (sign, payload) {
    const fn = this.getCallback(sign)
    if (fn) {
      return fn(payload)
    }
}
/**
* 根据标记获取函数
* @param {*} sign 
* @return {Function}
*/
getCallback (sign) {
    const key = Object.keys(this.ponds).find(key => key === sign)
    if (key) {
      return this.ponds[key]
    } else if (this._default) {
      return this._default
    }
}

实践

创建实例,用use和default收集管道,然后在拦截中通过start触发判断

const enterclose = new Enterclose()
// 收集管道
enterclose
.use(401, function (error) {
  console.log('未登陆')
  return login(error)
})
.use(404, function (error) {
  console.log('404-什么都没')
  return promise.reject(error)
})
.use(429, function (error) {
  console.log(error.response.data.message)
  return promise.reject(error)
})
.use(500, function (error) {
  console.log('服务器内部错误')
  return promise.reject(error)
})
.default(function (error) {
  // 收集默认管道
  return promise.reject(error)
})
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response;
}, function (error) {
  // 启动
  return enterclose.start(error.status, error)
});

你也可以根据自己的场景做一些调整,例如支持Promise啊,或者说加一个finally函数,每次走管道最后都会调用这个回调函数之类

总结

到此这篇关于如何消除axios拦截中if的文章就介绍到这了,更多相关消除axios拦截的if内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JavaScript实现页面局部更新的方法总结

    使用JavaScript实现页面局部更新的方法总结

    在JavaScript中,Ajax(Asynchronous JavaScript and XML)是一种用于在后台与服务器进行异步通信的技术,本文给大家介绍了使用JavaScript实现页面局部更新的三种方法,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Openlayers显示地理位置坐标的方法

    Openlayers显示地理位置坐标的方法

    这篇文章主要为大家详细介绍了Openlayers显示地理位置坐标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 防止video视频被下载的处理方法汇总

    防止video视频被下载的处理方法汇总

    这篇文章主要介绍了防止video视频被下载的处理方法汇总,本文给大家介绍了多种方法帮助大家解决防止video视频被下载的问题,补充介绍了解决video标签视频禁止下载方法,感兴趣的朋友一起看看吧
    2024-02-02
  • js变量声明var使用与不使用的区别详解

    js变量声明var使用与不使用的区别详解

    今天小编就为大家分享一篇关于js变量声明var使用与不使用的区别详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • JS获取随机数函数可自定义最小值最大值

    JS获取随机数函数可自定义最小值最大值

    这篇文章主要介绍的是一个JS获取随机数的函数可自定义最小值最大值,需要的朋友可以参考下
    2014-05-05
  • JavaScript实现仿windows文件名称排序

    JavaScript实现仿windows文件名称排序

    在JavaScript中,数组排序是一个常见的操作,本文将通过一个具体的代码示例,解释如何实现一个仿windows文件名称的排序算法,需要的可以参考下
    2024-12-12
  • JavaScript检测并限制复选框选中个数的方法

    JavaScript检测并限制复选框选中个数的方法

    这篇文章主要介绍了JavaScript检测并限制复选框选中个数的方法,涉及javascript针对复选框的判定与运算相关技巧,非常简单实用,需要的朋友可以参考下
    2015-08-08
  • JS iFrame加载慢怎么解决

    JS iFrame加载慢怎么解决

    这篇文章主要介绍了JS iFrame加载慢的解决方法,非常实用,感兴趣的朋友一起学习吧
    2016-05-05
  • JavaScript代码实现春晚刘谦魔术的模拟程序

    JavaScript代码实现春晚刘谦魔术的模拟程序

    昨晚春晚上刘谦的两个魔术表演都非常精彩,尤其是第二个魔术,他演绎了经典的约瑟夫环问题!约瑟夫环是一个经典的数学问题,本文给出了完整的 JavaScript 代码实现,感兴趣的同学可以自己动手实现一下
    2024-02-02
  • 快速对接payjq的个人微信支付接口过程解析

    快速对接payjq的个人微信支付接口过程解析

    这篇文章主要介绍了快速对接payjq的个人微信支付接口过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论