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

目录

注意:

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>
相关推荐
来自星星的坤1 小时前
【Vue 3 + Vue Router 4】如何正确重置路由实例(resetRouter)——避免“VueRouter is not defined”错误
前端·javascript·vue.js
Blurpath5 小时前
免费代理IP服务有哪些隐患?如何安全使用?
网络·安全·ip代理·住宅ip
香蕉可乐荷包蛋5 小时前
浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
前端·javascript·es6
未来之窗软件服务6 小时前
资源管理器必要性———仙盟创梦IDE
前端·javascript·ide·仙盟创梦ide
Douglassssssss6 小时前
【深度学习】使用块的网络(VGG)
网络·人工智能·深度学习
liuyang___7 小时前
第一次经历项目上线
前端·typescript
python算法(魔法师版)7 小时前
网络编程入门(一)
大数据·网络·网络协议·计算机网络
网络小白不怕黑7 小时前
Python Socket编程:实现简单的客户端-服务器通信
服务器·网络·python
西哥写代码7 小时前
基于cornerstone3D的dicom影像浏览器 第十八章 自定义序列自动播放条
前端·javascript·vue
清风细雨_林木木7 小时前
Vue 中生成源码映射文件,配置 map
前端·javascript·vue.js