前端开发攻略---取消已经发出但是还未响应的网络请求

目录

注意:

1、Axios实现

2、Fetch实现

3、XHR实现


注意:

当请求被取消时,只会本地停止处理此次请求,服务器仍然可能已经接收到了并处理了该请求。开发时应当及时和后端进行友好沟通。

1、Axios实现

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="getData()">获取数据</button>
    <button onclick="cancel()">取消请求</button>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.2/axios.min.js"></script>
    <script>
      // 创建一个取消令牌
      const CancelToken = axios.CancelToken
      // 用于存储取消函数
      let cancelFn = null
      function getData() {
        // 发起请求
        axios
          .get('http://127.0.0.1:3000/data', {
            cancelToken: new CancelToken(function executor(c) {
              cancelFn = c // 保存取消函数
            }),
          })
          .then(response => {
            // 请求成功时处理响应
            console.log('拿到数据:', response.data)
          })
          .catch(error => {
            // 处理错误
            if (axios.isCancel(error)) {
              // 如果是取消请求的错误,输出相关信息
              console.log('请求已取消:', error.message)
            } else {
              // 处理其他类型的请求错误
              console.error('请求失败:', error)
            }
          })
      }
      function cancel() {
        // 调用取消函数,传入取消的原因
        cancelFn && cancelFn('取消请求') // 取消请求
      }
    </script>
  </body>
</html>

2、Fetch实现

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="getData()">获取数据</button>
    <button onclick="cancel()">取消请求</button>
    <script>
      let controller = null
      function getData() {
        // 创建一个AbortController实例
        controller = new AbortController()
        // 发起请求
        fetch('http://127.0.0.1:3000/data', { signal: controller.signal })
          .then(response => {
            if (!response.ok) {
              throw new Error('获取数据失败')
            }
            return response.json()
          })
          .then(data => {
            console.log(data)
          })
          .catch(error => {
            if (error.name === 'AbortError') {
              console.log('Fetch请求已取消')
            } else {
              console.error('Fetch请求错误:', error)
            }
          })
      }

      function cancel() {
        controller && controller.abort() // 取消请求
      }

    </script>
  </body>
</html>

3、XHR实现

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="getData()">获取数据</button>
    <button onclick="cancel()">取消请求</button>
    <script>
      let xhr = null
      function getData() {
        // 创建一个新的 XMLHttpRequest 对象
        xhr = new XMLHttpRequest()
        // 配置请求
        xhr.open('GET', 'http://127.0.0.1:3000/data', true)
        // 定义回调函数
        xhr.onload = function () {
          if (xhr.status >= 200 && xhr.status < 300) {
            console.log('响应结果:', xhr.responseText)
          } else {
            console.error('响应失败:', xhr.status)
          }
        }
        xhr.onerror = function () {
          console.error('请求失败')
        }
        // 发送请求
        xhr.send()
      }
      function cancel() {
        xhr && xhr.abort() // 取消请求
      }
    </script>
  </body>
</html>
相关推荐
普普通通的南瓜15 小时前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl
hadage23315 小时前
--- JavaScript 的一些常用语法总结 ---
java·前端·javascript
彭于晏爱编程15 小时前
🍭🍭🍭升级 AntD 6:做第一个吃螃蟹的人
前端
掘金一周15 小时前
大部分人都错了!这才是chrome插件多脚本通信的正确姿势 | 掘金一周 11.27
前端·人工智能·后端
jason_yang15 小时前
vue3中createApp多个实例共享状态
javascript·vue.js
_瑶瑶_15 小时前
浅记一下ElementPlus中的虚拟化表格(el-table-v2)的简单使用
前端·javascript
Drift_Dream16 小时前
ResizeObserver:轻松监听元素尺寸变化
前端
拉不动的猪16 小时前
Axios 请求取消机制详解
前端·javascript·面试
该用户已不存在16 小时前
2025 年 8 款最佳远程协作工具
前端·后端·远程工作
lxh011316 小时前
螺旋数组题解
前端·算法·js