请求中断
请求已经发出去了,怎样取消掉这个已经发出去的请求?
微信扫码体验一下 (说不定哪天你就用得上)
用途:
- 比如取消正在下载中的文件
- 点击差别的下拉框选项,向服务器发送新请求但携带差别的参数,响应回来的数据在折线图内里展示。每次请求的数据量较大,但着实只要渲染最后一次选择。
- 应用场景迁移,一样平常在数据量较大的情况下,可通过请求中断,节流网络资源
做法
- <script setup lang="ts">
- import axios from 'axios'
- import { ref } from 'vue'
- const progress = ref(0) // 进度条百分比
- let controller: AbortController // 中止控制器
- // 中止下载
- const abortDownload = () => {
- if (controller) {
- controller.abort() // 使用 abort 方法中止下载
- console.log('中止下载')
- }
- }
- // 下载视频
- const fetchVideo = () => {
- controller = new AbortController() // 创建 AbortController
- axios({
- // 将中止控制器传递给 axios 的 get 方法
- method: 'GET',
- url: 'http://localhost:3000/video',
- signal: controller.signal,
- responseType: 'arraybuffer',
- onDownloadProgress: (progressEvent) => {
- // 计算进度百分比
- progress.value = Math.round((progressEvent.loaded / progressEvent.total!) * 100)
- }
- })
- .then((response) => {
- console.log('下载完成', response)
- // ✅ 保存下载的文件
- const { buffer } = new Uint8Array(response.data)
- const blob = new Blob([buffer], { type: 'application/octet-stream' })
- const link = document.createElement('a') // 创建链接元素
- link.href = URL.createObjectURL(blob) // 将 Blob 对象转换为 URL
- link.download = 'video.mp4' // 设置文件名
- link.click() // 模拟点击链接元素
- })
- .catch((err) => {
- if (axios.isCancel(err)) {
- console.log('下载被取消')
- } else if (err.name === 'AbortError') {
- console.log('下载被中止')
- } else {
- console.error(`下载错误:${err.message}`)
- }
- })
- }
- </script>
- <template>
- <div>
- <button class="download" @click="fetchVideo">下载视频</button>
- <button class="abort" @click="abortDownload">中止下载</button>
- <div class="progress-bar">
- <div class="progress" :style="{ width: progress + '%' }"></div>
- {{ progress }}%
- </div>
- </div>
- </template>
- <style scoped>
- .progress-bar {
- height: 20px;
- background-color: #eee;
- margin-top: 10px;
- }
- .progress {
- width: 0%;
- height: 100%;
- background-color: #4caf50;
- transition: width 0.2s linear;
- }
- </style>
复制代码 请求重试
拓展一个插件 axios-retry 插件
1 .axios-retry 1.6k 插件可以更方便实现请求重试。
2. 配置 axios-retry 核心属性
- <script setup lang="ts">
- import axios from 'axios'
- import axiosRetry from 'axios-retry'
- const request = axios.create({
- baseURL: 'http://localhost:3000',
- timeout: 2000,
- })
- // axios-retry 插件
- axiosRetry(request, {
- retries: 3, // 设置重试次数
- retryDelay: () => 500, // 设置重试延迟时间
- shouldResetTimeout: true, // 重置请求超时时间
- retryCondition: (error) => ['ECONNABORTED', 'ERR_NETWORK'].includes(error.code!), // 重试条件
- })
- // 请求中止控制器
- let controller: AbortController
- // --- 获取数据 ---
- const getData = async () => {
- // 请求控制器
- controller = new AbortController()
- const res = await request({
- method: 'GET',
- url: '/delay_3s_data',
- signal: controller.signal, // 添加请求中止标识
- })
- console.log('成功获取数据', res)
- }
- const stop = () => {
- // 中止网络请求
- controller.abort()
- }
- </script>
- <template>
- <h1>axios请求重试-axiosRetry</h1>
- <button @click="getData()">发送请求</button>
- <button @click="stop()">中止请求</button>
- </template>
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |