iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >项目中如何使用axios过滤多次重复请求
  • 241
分享到

项目中如何使用axios过滤多次重复请求

2023-06-20 14:06:03 241人浏览 泡泡鱼
摘要

这篇文章主要讲解了“项目中如何使用axiOS过滤多次重复请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“项目中如何使用axios过滤多次重复请求”吧!目录一、前言:这个情况下,我们通常的做

这篇文章主要讲解了“项目中如何使用axiOS过滤多次重复请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“项目中如何使用axios过滤多次重复请求”吧!

目录
  • 一、前言:

    • 这个情况下,我们通常的做法有两种:

  • 二、CancelToken类

    • 最终效果

一、前言:

我们在WEB应用开发过程当中,经常会遇到一个时刻发起了多个请求的场景

项目中如何使用axios过滤多次重复请求

这个情况下,我们通常的做法有两种:

  • 可以在请求时show一个loading,阻止用户操作。

  • 或者人为加个变量,做一个请求的节流

我们的项目中,目前大部分情况也是采用以上两种方式做的。今天来介绍一个新的方式。

二、CancelToken类

我们之前实例化一个Promise,这个对象是否成功与否,是无法在函数外部决定的,这里边使用要用到一个小窍门,可以让一个promise 和resolve分离。任何时机都可以触发resolve:

  // 一个promise  let resolvePromise  let p = new Promise((resolve, reject) => {    resolvePromise = resolve  })  // 这样在外部执行  resolvePromise()

ok,有了这个前提,我们需要借助axios.CancelToken这个类。

这个类相当于在每次请求的时候开启另一个promise和当前的请求形成一个promise.race(请求p1,取消请求p2),在promise中的resolve方法赋值给了一个外部的变量去接收。我们可以根据需求,人为决定是否取消前次请求。其实这就类似,原来我们写fetch封装接口超时的Promise.race类似。

cancelToken中也提供了相应的static方法source用来生成一个cancelToken和一个cancel方法其实就是这个promise的一个resolve。

CancelToken.source = function source() {    var cancel;    //     var token = new CancelToken(function executor(c) {        cancel = c;    });    return {        token: token,        cancel: cancel,    };

根据我们常用的的缓存方式,我们可以声明一个map来存储每次请求的url,同时存储对应的cancel方法。

// 声明一个全局map    const pendingHttp = new Map()    // axios中内置的CancelToken类    const CancelToken = axios.CancelToken           function addapi (config) {      config.cancelToken = new CancelToken((cancel) => {        const url = config.url        console.log(pendingHttp)        if (!pendingHttp.has(url)) {          pendingHttp.set(url, cancel)        }      })    }    function cancelApi (config) {      const url = config.url      if (pendingHttp.has(url)) { // 如果在 pending 中存在当前请求标识,需要取消当前请求,并且移除        const cancel = pendingHttp.get(url)        cancel(url + '取消了')        pendingHttp.delete(url) // 清空当前url的缓存      }    }
  • 要特殊注意,要想取消掉一个请求,需要在config上添加cancelToken这个属性赋值为CancelToken的实例。否则cancel不掉。

就像操作定时器一样,要先尝试取消上一次,然后再开启下一次

httpservice.interceptors.request.use(config => {      cancelApi(config)      addApi(config)            // 本地调试的时候,是跨域的情况,加请求头会有限制(此处是项目代码无关紧要)      const { headers = {} } = config; const { globalObj = {} } = window      Object.assign(headers, globalObj, { from })            return config    }, error => {      console.log(error)      return Promise.reject(error)    })

然后还有一种可能性,第一次请求已经返回了,又发起了相同的一次请求,所以在response里边也要cancelApi一下。

httpService.interceptors.response.use(      response => {        cancelApi(response.config)        sentryCatchApi(response)      },      error => {        // 请求超时        if (error.message.includes('timeout')) { // 判断请求异常信息中是否含有超时timeout字符串          Toast.error({ text: '网页请求超时,请刷新重试~' })        }        sentryCatchApi(error)        return Promise.reject(error)      }    )

我们需要注意一点,cancel其实就是resolve,我们cancel执行时候传入的参数,会最终在response的error回调中,作为参数返回,这样我们的捕捉错误的方法可能会有报错。

// 假设我们的error方法是这样封装的。 来看一下sentryCatchApi    error => {      sentryCatchApi(error)      return Promise.reject(error)    }  // 由于这个方法需要接收一个对象,但是我们cancel取消请求的情况下,返回的是一个字符串,这时就报错了。  function sentryCatchApi (res) {      try {        res = res || {}        const resData = res.data || {}        Sentry.captureException(JSON.stringify(resData))        console.log(`          获取数据失败:          请在浏览器中打开进入 webview的地址,并粘贴出来,便于问题排查          :接口相关信息:          接口地址:${res.config.url},          接口返回值:code:${resData.code},          message:${resData.message},          data:${jsON.stringify(resData.data)}        `)      } catch (err) {        console.error(err)      }    }

需要使用isCancel这个api

   error => {    if (axios.isCancel(error)) return console.log('请求被取消了', error.message)    sentryCatchApi(error)    return Promise.reject(error)  }

最终效果

项目中如何使用axios过滤多次重复请求

控制台也没有任何报错啦。(后续完善到项目中)

感谢各位的阅读,以上就是“项目中如何使用axios过滤多次重复请求”的内容了,经过本文的学习后,相信大家对项目中如何使用axios过滤多次重复请求这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 项目中如何使用axios过滤多次重复请求

本文链接: https://www.lsjlt.com/news/297423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作