接口竞态问题处理方案

47 阅读1分钟

## 接口竞态问题处理

需求场景

  1. 针对tab页签切换时,接口响应时长不同导致数据错乱

解决方法

每次切换时,正对上一次的请求进行中断处理

  1. 使用axioxs.CancelToken.source()方法进行中断处理

    let cancelTokenSource = null; ()=>{ // 如果上一次请求还没完成,先取消它 if (cancelTokenSource) { cancelTokenSource.cancel('取消上一次请求'); } // 创建新的取消令牌 cancelTokenSource = axios.CancelToken.source(); axios.get('/api', { params: { tabId },//参数体 cancelToken: cancelTokenSource.token,//其他配置项 }) 复制代码

  2. 使用 AbortController 中断

  • 此方案的axios的版本要高于0.22.0

  • node的版本要高于18

    import axios from 'axios'; let controller: AbortController | null = null; ()=>{ // 如果上一次请求还没完成,先取消它 if (controller) { controller.abort(); } // 创建新的 AbortController controller = new AbortController(); axios.get('/api', { params: { tabId },//参数体 signal: controller.signal, // 传入 signal //其他配置项 }).then(()=>{

    }).catch( error => { if (axios.isCancel(error)) { // 旧的 CancelToken 取消方式判断 console.log('请求被取消'); } else if (error.name === 'CanceledError') { // AbortController 取消请求的错误名 console.log('请求被取消 (AbortController)'); } else { console.error('请求错误', error); } }); 复制代码

未解决点

未解决点:

  1. 此处遇到了contriller.abort()为undefined