系统定制开发【前端AJAX】如何处理AJAX请求超时和网络异常?以及手动取消AJAX请求的方法

文章目录


1. 🐱‍👤AJAX系统定制开发请求超时和网络异常处理

分析:系统定制开发当前端向后端发起数据请求时,系统定制开发后端一直没有返回响应结果,系统定制开发不可能让用户一直等待下去,系统定制开发所以当请求超过一定的时间,系统定制开发就要提示用户或者取消这个请求。

1.1 🥜案例

  1. 系统定制开发点击发送请求按钮,等待2s后,系统定制开发弹出网络异常的弹框
  2. 当在控制台断开网络时,弹出网络出现问题的弹框

效果如下:

在服务器中设置一个定时器,模拟给服务器发送请求超时的情况,当3s后返回响应结果。
server.js

// 1.引入expressconst { response } = require('express')const express = require('express')// 2.创建应用对象const app = express()// 3.创建路由规则// request是对请求报文的封装// response是对响应报文的封装// 延时响应app.get('/delay', (request, response) => {  // 设置响应头 设置允许跨域  response.setHeader('Access-Control-Allow-Origin', '*')  setTimeout(() => {    // 设置响应体        response.send('延时响应')  }, 3000)})// 4.监听端口启动服务 app.listen(8000, () => {  console.log("服务已经启动,8000 端口监听中....")})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

1.2 🔧请求超时的处理

在客户端设置超时2s(服务器3s之后才会返回响应结果),自动取消请求,并弹框告知用户网络异常。

const xhr = new XMLHttpRequest()// 超时设置 2s 设置(超过2s请求取消)xhr.timeout = 2000// 超时回调xhr.ontimeout = function () {alert('网络异常,请稍后重试!!!')}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.3 🔩请求时网络异常的处理

分析:网络异常出现的原因可能是网络断开,但是我们不能让用户无限的等待,所以我们可以通过设置网络异常来提醒用户,网络出现了问题。

当无网络连接时(可以在控制台设置网络为 offline),调用网络异常的回调,并弹框告知用户网络有问题。

// 网络异常回调xhr.onerror = function () {    alert('你的网络似乎出了一些问题!!')}
  • 1
  • 2
  • 3
  • 4

整体代码如下:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>请求超时与网络异常</title>  <style>    #result {      width: 200px;      height: 100px;      border: solid 1px #90b;    }  </style></head><body>  <button>点击发送请求</button>  <div id="result"></div>  <script>    const btn = document.getElementsByTagName('button')[0]    const result = document.getElementById('result')    btn.onclick = function () {      const xhr = new XMLHttpRequest()      // 超时设置 2s 设置(超过2s请求取消)      xhr.timeout = 2000      // 超时回调      xhr.ontimeout = function () {        alert('网络异常,请稍后重试!!!')      }      // 网络异常回调      xhr.onerror = function () {        alert('你的网络似乎出了一些问题!!')      }      xhr.open('GET', 'http://127.0.0.1:8000/delay')      xhr.send()      xhr.onreadystatechange = function () {        if (xhr.readyState === 4) {          if (xhr.status >= 200 && xhr.status < 300) {            result.innerHTML = xhr.response          }        }      }    }  </script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

2. 🔨如何手动取消AJAX请求

分析:取消请求发生在我们已经发送了请求,但是请求结果还没有返回给我们,这时我们可以设置取消请求。

2.1 🥜案例

  1. 当点击发送按钮,发送AJAX请求
  2. 当点击取消按钮,取消发送AJAX请求

效果如下:

还是和上述一样,在服务器中设置一个定时器,模拟给服务器发送请求超时的情况,当3s后返回响应结果。
server.js

// 1.引入expressconst { response } = require('express')const express = require('express')// 2.创建应用对象const app = express()// 3.创建路由规则// request是对请求报文的封装// response是对响应报文的封装// 延时响应app.get('/delay', (request, response) => {  // 设置响应头 设置允许跨域  response.setHeader('Access-Control-Allow-Origin', '*')  setTimeout(() => {    // 设置响应体        response.send('延时响应')  }, 3000)})// 4.监听端口启动服务 app.listen(8000, () => {  console.log("服务已经启动,8000 端口监听中....")})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2.2 🔧取消AJAX请求方法

当点击取消按钮时,调用abort()方法来取消请求

取消请求.html

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>取消请求</title></head><body>  <button>点击发送</button>  <button>点击取消</button>  <script>    // 获取元素对象    const btns = document.querySelectorAll('button')    let xhr = null    btns[0].onclick = function () {      xhr = new XMLHttpRequest()      xhr.open('GET', 'http://127.0.0.1:8000/delay')      xhr.send()    }    // 调用abort()方法手动取消请求    // abort():用来终止一个进程    btns[1].onclick = function () {      xhr.abort()    }  </script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

需要注意的是:前面我们使用了const的方法,进行对进行声明,但是要注意const的值是不能改的,所以我们要首先使用let进行xhr=null的赋值,然后再对xhr = new XMLHttpRequest()。

2.3 🔩解决重复发送请求的问题

设置一个标识变量isSending,当点击发送按钮时,判断isSending的布尔值

<body>  <button>点击发送</button>  <script>    // 获取元素对象    const btns = document.querySelectorAll('button')    let xhr = null    // 标识变量    // 是否正在发送AJAX请求,当为false表示未在发送请求,反之则正在发送请求    let isSending = false    btns[0].onclick = function () {      // 判断标识变量      // 如果正在发送,则取消该请求,创建一个新的请求      if (isSending) xhr.abort()      xhr = new XMLHttpRequest()      //修改 标识变量的值       isSending = true      xhr.open('GET', 'http://127.0.0.1:8000/delay')      xhr.send()      xhr.onreadystatechange = function () {        if (xhr.readyState === 4) {          // 修改标识变量          isSending = false        }      }    }  </script></body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

今天的分享就到这里啦。✨
关注💖 点赞🤞 收藏🌹

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发