vue3 axios封装接口请求 useAxiosWithCancel hook

实际项目需求,类似机器人对话。生成对话过程中有个停止生成。点击停止生成中断请求。axios提供两种方法

  • 1 .使用 AbortController
  • 2CancelToken
    取消请求机制说明:

从 v0.22.0 开始,Axios 支持以 fetch API 方式—— AbortController 取消请求:(官方推荐使用)

AbortController(中止控制器)作用和使用

  • AbortController 接口代表一个控制器对象,允许您在需要时中止一个或多个 Web 请求

创建构造函数AbortController()

let controller = new AbortController()

实例属性

AbortController.signal 只读
返回一个 AbortSignal 对象实例,该实例可用于与异步操作通信或中止异步操作。

const { signal } = controller

实例方法

在异步操作完成之前中止该操作。这能够中止获取请求、任何响应主体和流的消耗。

controller.abort() //在异步操作完成之前中止该操作。这能够中止获取请求、任何响应主体和流的消耗。

代码两种终止示例

创建CancelToken源:在每个请求发出前,使用CancelToken.source()创建一个新的取消令牌源
关联CancelToken:将新创建的CancelToken源的token属性添加到请求的配置中,作为cancelToken属性。

取消请求:当需要取消一个请求时,通过其唯一标识从cacheRequest中取出对应的取消函数并执行它,从而取消该请求。

/** @Description: 取消请求*/
import { ref, onUnmounted } from 'vue'
import axios from 'axios'
import qs from 'qs'import { eventBus } from '@/utils/eventBus.js'
import { noop } from 'lodash-es'// let controller
const { CancelToken } = axios
export function useAxiosWithCancel({searchAPI,immediate = true,queryFactory = noop,errorRequest = noop,beforeBuild = noop,onSuccess = noop
}) {const data = ref(null)const error = ref(null)const loading = ref(false)let cancelTokenSource = nullconst query = ref(queryFactory())const queryAPI = ref(searchAPI)const fetchData = async (data) => {cancelRequest() // 先取消之前的请求query.value = { ...query.value, ...data }loading.value = truecancelTokenSource = CancelToken.source()// controller = new AbortController()// const { signal } = controller// console.log(cancelTokenSource)const { token } = cancelTokenSource// console.log(token)try {const response = await axios.post(queryAPI.value, qs.stringify({ ...query.value }), {// signal,cancelToken: token})data.value = response.dataerror.value = nullconst res = response.dataonSuccess(res)} catch (err) {if (axios.isCancel(err)) {console.log('请求被取消:', err.message)} else {error.value = `请求出错: ${err.message}`}errorRequest()} finally {}}const cancelRequest = () => {if (cancelTokenSource) {cancelTokenSource.cancel('请求被取消')cancelTokenSource = null}// if (controller) {//   controller.abort()//   console.log('Download aborted')// }}const setSearchAPI = (newAPI) => {queryAPI.value = newAPI}// 确保取消未完成的请求onUnmounted(() => {cancelRequest()})// 如果需要立即执行请求if (immediate) {fetchData()}return { fetchData, data, error, loading, cancelRequest, setSearchAPI }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240623日志:大模型压缩-sliceGPT

context 1. 剪枝方案图释2. 正交矩阵Q 1. 剪枝方案图释 Fig. 1.1 剪枝方案 图中的阴影是表示丢弃掉这部分数据。通过引入正交矩阵 Q Q Q使 Q ⊤ Q Q Q ⊤ I \mathrm{Q}^\top\mathrm{Q}\mathrm{Q}\mathrm{Q}^\top\mathrm{I} Q⊤QQQ⊤I,来大量缩减 X X X的列数和 W …

androidx.preference框架介绍

一,概要 Preference作为setting核心框架,笔者对此框架做一个简单的解析,androidx.preference本质是对设置领域提供了一层View封装,以android view本身的策略模式进行二次开发,将常用的一些设置样式封装到不同的Preference中,以达到快速开发设置相关功能。并且,此风格与…

将 MinIO 与 Keycloak OIDC 集成

Keycloak是一种单点登录解决方案。使用Keycloak,用户使用Keycloak而不是MinIO进行身份验证。如果没有Keycloak,您将不得不为每个用户创建一个单独的身份 - 从长远来看,这将很麻烦。您需要一个集中身份解决方案来管理 MinIO 的身份验证和授权。…

OpenHarmony 5.0 纯血鸿蒙系统

OpenHarmony-v5.0-Beta1 版本已于 2024-06-20 发布。 OpenHarmony 5.0 Beta1 版本标准系统能力持续完善,ArkUI 完善了组件通过 C API 调用的能力;应用框架细化了生命周期管理能力,完善了应用拉起、跳转的能力;分布式软总线连接能力…

每日一练 - IGMP Snooping工作机制详解

01 真题题目 关于 IGMP Snooping 工作机制的描述,正确的是? A.如果主机发出的 IGMP 离开报文时,交换机将该主机加入到相应的组播表中 B.如主机发出的 IGMP 主机撒告文时交换机将翻除与读主机对的组播表项 C.二层交换机通过不断听 IGMP 报文在二层建立和维护 MAC 广播地址表…

【面试题】漏洞复现的步骤

漏洞复现是信息安全工作中非常重要的一个环节,它通过对已发现的漏洞进行模拟攻击,来验证漏洞的存在性并深入理解其影响。以下是漏洞复现的主要步骤,并尽量以分点表示和归纳的形式呈现: 1. 收集漏洞信息 从漏洞公告、CVE&#xf…

laravel 使用RabbitMQ作为消息中间件

先搞定环境,安装amqp扩展 确保已安装rabbitmq-c-dev。 比如 可以使用apk add rabbmit-c-dev安装 cd ~ wget http://pecl.php.net/get/amqp-1.10.2.tgz tar -zxf amqp-1.10.2.tgz cd amqp-1.10.2 phpize ./configure make && make install cd ~ rm -rf am…

vuex的深入学习[基于vuex3]----篇(三)

vuex的深入学习[基于vuex3]----篇(三) 这篇美团的博客非常好。直接看就行 https://tech.meituan.com/2017/04/27/vuex-code-analysis.html

Vue2中的render函数

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用render渲染函数,它比模板更接近编译器 。 在Vue2中,render函数是一个可选的、用于生成虚拟DOM的特殊函数。它是Vu…

2024年最新【交安】公路水运安全员备考题库。

46.(  )负责建筑施工企业安全生产许可证的颁发和管理,并接受国务院建设主管部门的指导和监督。 A.国务院建设主管部门 B.国务院安全生产监督管理部门 C.省、自治区、直辖市人民政府建设主管部门 D.省、自治区、直辖市人民政府安全生产监督管理部门 答案&…

变量在PHP中是如何使用的?

在PHP中,变量是用于存储数据的容器,可以存放各种类型的数据,如数字、文本字符串、布尔值等。PHP是一种弱类型语言,这意味着在使用变量时不需要事先声明其类型,PHP会根据变量的值自动将其转换为正确的数据类型。 定义变…

国际网络专线怎么开通?

在全球化日益加速的今天,企业越来越需要稳定、高效的网络来支撑他们的跨国业务。国际网络专线,作为外贸企业、出海企业等拓展全球业务的关键基础设施,其重要性不言而喻。那么,企业如何才能开通国际网络专线呢?本文将详…

Amazon Q Developer 实战:从新代码生成到遗留代码优化(下)

简述 本文是使用 Amazon Q Developer 探索如何在 Visual Studio Code 集成编程环境(IDE),从新代码生成到遗留代码优化的续集。在上一篇博客《Amazon Q Developer 实战:从新代码生成到遗留代码优化(上)》中…

深度学习初探:一场迷人的AI之旅

嘿,小伙伴们!今天咱们来聊聊一个超级酷的话题——深度学习。虽然听起来有点高大上,但其实它也没那么神秘。接下来我们一起轻松入门,揭开深度学习的面纱。 1. 深度学习概述 首先,什么是深度学习呢?简单来说&…

docker常见问题-持续更新

docker 启动的问题解决 解决: 下载更新linux的win子系统, 重启就可以 WSL 2 installation is incomplete. 更加报错提示,猜测可能是我们使用的wsl2版本老了,需要我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开。更新包下载链接。 https://ws…

HBase:大数据时代的分布式存储利器

HBase:大数据时代的分布式存储利器 HBase:大数据时代的分布式存储利器1. HBase简介2. HBase特点3. HBase应用场景4. 总结 HBase:大数据时代的分布式存储利器 随着互联网和大数据技术的飞速发展,数据存储和计算需求呈现出爆炸式增…

Arduino - 串行绘图仪

Arduino - Serial Plotter Arduino - 串行绘图仪 In this tutorial, we will learn how to use the Serial Plotter on Arduino IDE, how to plot the multiple graphs. 在本教程中,我们将学习如何在Arduino IDE上使用串行绘图仪,如何绘制多个图形。 A…

Swift Combine — Operators(常用Filtering类操作符介绍)

目录 filter(_: )tryFilter(_: )compactMap(_: )tryCompactMap(_: )removeDuplicates()first(where:)last(where:) Combine中对 Publisher的值进行操作的方法称为 Operator(操作符)。 Combine中的 Operator通常会生成一个 Publisher,该 …

jupyter notebook的安装与使用

jupyter notebook的安装与使用 使用jupyter notebook有两种方法: 使用vscode里的插件直接运行jupyter程序。使用原生的基于浏览器网页的方式访问,需要在终端里开启jupyter的服务。 方法一: VSCODE中使用jupyter 在vscode中新建.ipynb后缀…

webstorm无法识别@路径的问题,左键无法跳转

在项目根目录下创建 webstorm.config.js use strict; const webpackConfig require(vue/cli-service/webpack.config.js); module.exports webpackConfig;webstorm设置里找到以下位置,引入新建的 webstorm.config.js即可,不生效把webstorm重启一下