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

目录

注意:

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>
相关推荐
To_OC5 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus5 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮6 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
用户938515635077 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库 + RAG 让机器读懂你的每一天
javascript·人工智能·全栈
徐小夕8 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
a1117768 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
kyriewen9 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz9 小时前
Rust &‘static str浅析
java·前端·javascript·rust
可爱系程序猿9 小时前
Windows 打印链路诊断:从设备枚举、TCP/IP 端口到 Spooler 服务恢复
网络·网络协议·tcp/ip
IT_陈寒10 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端