Vue Axios响应拦截器Message弹框多次出现解决方案

文章介绍了如何利用Lodash的debounce函数来优化错误通知的显示,防止短时间内频繁出现相同错误消息。在响应拦截器中,当错误发生时,如果错误信息与上一次相同且时间间隔小于2秒,则不会立即显示错误通知,以此提供更好的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用去抖函数Debounce

//cnpm下载
cnpm install lodash --save


import { debounce } from 'lodash';

  设置一个变量用于记录上一次错误信息和时间戳

let lastError = null;
let lastErrorTimestamp = 0;

// 定义一个函数用于显示错误消息,并进行防抖处理
const showErrorNotification = debounce((message, type) => {
//Message要事先引入  import Message from 'element-ui'
  Message({ message, type, duration: 5 * 1000 });   
}, 2000); // 设置防抖的等待时间,比如 2000 毫秒


// 响应拦截器
service.interceptors.response.use(
  res => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = errorCode[code] || res.data.msg || errorCode['default'];

    if (code === 500) {
      showErrorNotification(msg, 'error');
      return Promise.reject(new Error(msg));
    } else if (code === 601) {
      showErrorNotification(msg, 'warning');
      return Promise.reject('error');
    } else if (code !== 200) {
      showErrorNotification(msg, 'error');
      return Promise.reject(new Error(msg));
    } else {
      return res.data;
    }
  },
  error => {
    console.log('err' + error);
    let { message } = error;
    if (message == 'Network Error') {
      message = '后端接口连接异常';
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时';
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.substr(message.length - 3) + '异常';
    }

    // 如果错误信息和上次相同且距离上次时间间隔较短,则不显示错误消息
    const currentTime = Date.now();
    if (message !== lastError || currentTime - lastErrorTimestamp > 2000) {
      showErrorNotification(message, 'error');
      lastError = message;
      lastErrorTimestamp = currentTime;
    }

    return Promise.reject(error);
  }
);

使用 Lodash 的debounce功能来确保错误通知延迟显示。它检查错误消息是否与上一个错误相同以及时间间隔是否较短(例如,2 秒)。如果两个条件都成立,则不会显示错误通知。这样,可以避免同时出现多个错误消息。

Vue中配置Axios拦截器可以通过以下步骤实现: 1. 首先,在项目中引入Axios库和需要的其他依赖(例如Element UI)。 2. 创建一个Axios实例,可以命名为`instances`,并设置`baseURL`等配置项。 3. 在创建的Axios实例中,使用`interceptors`属性来配置响应拦截器。 4. 在响应拦截器中,可以通过`instances.interceptors.response.use()`方法来定义成功和失败的处理函数。 5. 在成功处理函数中,可以对接口调用成功后的响应进行处理,例如打印日志或进行其他操作。 6. 在失败处理函数中,可以对接口调用失败时的情况进行处理,例如打印错误信息或显示提示消息。 7. 最后,导出配置好的Axios实例,以便在项目其他地方使用。 以下是一个示例代码,演示了如何配置Vue中的Axios拦截器: ```javascript import axios from 'axios'; import { Message } from 'element-ui'; import router from '../router'; const instances = axios.create({ baseURL: 'http://localhost', }); instances.interceptors.response.use( success => { console.log('响应拦截器,成功'); // 在这里对成功的响应进行处理 }, error => { console.log('响应拦截器,失败', error); Message.error({ message: error }); // 在这里对失败的响应进行处理 } ); export default instances; ``` 请注意,上述代码是一个示例,你可以根据自己的需求进行修改和扩展。同时,还可以根据需要配置请求拦截器,以实现在所有请求中添加统一的内容,例如请求头等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值