前言

一直很头疼axios的失败重试插件axios-retry会重复调用axios自定义的响应错误拦截器,而我们常常会在这个拦截器中编写一个用于弹出错误消息的弹窗,这就导致了一个问题:

如果我们失败会重试3次,那么全部都失败的话就会触发4次响应错误拦截器,然后就会导致触发4次错误消息的弹窗,非常蛋疼。

为此常常需要考虑怎么避免重复触发的问题,常见的一些做法比如通过自定义的拦截器接受的error对象上的config属性,添加一个计数器来处理,如果计数器大于等于3的话就可以触发消息弹窗。

本来axios-retry插件本身就会在config上注入一个计数的属性和总次数,但是也没法用,实际测试中发现,被触发的响应错误拦截器是在重试3次完后再连续触发的,它不是重试一次触发一次,贼头疼,没法直接用来做判断条件。

所以只能自己通过axios-retry的retryCondition方法,每次重试前控制一个自定义的计数属性,然后再去响应错误拦截器中拿去,再判断,从而避免消息弹窗重复触发。

这种方法以前也弄过,做起来非常复杂,而且不易维护,不了解的人从代码中看到了一堆很奇怪的逻辑。

最近重新封装了一个axios,找到了一个非常简易且好维护的方式。

有时候也不能说它触发4次是有问题的,因为确实发起了请求,理论上讲触发错误拦截器也不是不行,特别在后端发起请求需要记录log日志时,这又变得非常有用,只能说环境不同,对应的问题反倒是最优解。

教程

旧代码

javascript
复制代码
import axios from "axios"; import axiosRetry from "axios-retry"; import { ElNotification } from "element-plus"; const instance = axios.create(); // 先激活插件 axiosRetry(instance); // 再添加拦截器 instance.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config; }); instance.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 return response; }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 //错误消息弹窗 ElNotification({ type: "error", title: "请求失败", message: "错误消息" }); return Promise.reject(error); });

当请求发生5xx的状态错误时,就会触发4次消息弹窗。

此处内容已隐藏回复后方可阅读。

分类: vue 项目实战 标签: axios拦截器失败重试axios-retry错误弹窗

评论

全部评论 1

  1. 1231231
    1231231
    Google Chrome Windows 10
    1111飞车

目录