前端如何中断请求 ( axios、原生 ajax、fetch)

这篇具有很好参考价值的文章主要介绍了前端如何中断请求 ( axios、原生 ajax、fetch)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用场景

在前端开发中,我们经常需要中断请求来优化性能或处理特定的业务需求。以下是一些常见的使用场景:
比如

  1. 重复请求:当页面中多个组件并发调用同一个接口时,在第一个请求返回后,我们可能需要中断其他组件对该接口的调用,以避免重复请求和冗余数据。这在组件高度复用、不依赖公共 API 的情况下特别有用。
  2. 竞态请求:当页面定时轮询发起请求时,如果上一个请求的响应速度比下一个请求慢,会导致数据错乱。中断较慢的请求可以确保只处理最新的数据,避免竞态条件。
  3. 无效请求:在单页应用中,当组件加载过慢,路由跳转后可能会导致组件卸载,但请求仍在进行中。如果接口返回错误,错误提示可能会在其他页面弹出。中断无效请求可以避免不必要的错误提示。
  4. 大文件上传暂停与恢复:在实现大文件上传功能时,用户可能会需要暂停和恢复上传过程。中断请求可以实现暂停功能,并在需要时重新发起请求以实现恢复上传。

除了以上提到的场景,还有许多其他情况需要中断请求以减少对服务器的无效请求。

下面介绍几种终止请求的方案

原生ajax终止请求

abort() 方法

XMLHttpRequest.abort() 方法用于终止 XMLHttpRequest 对象的请求。调用该方法后,如果请求正在处理中,则会中止该请求;如果请求已经完成(即已经接收到完整的响应),则不会执行任何操作。同时,调用该方法会触发 XMLHttpRequest 对象的 abort 事件,我们可以在事件处理函数中执行后续的逻辑代码,如清除请求相关的数据等。

当一个请求被终止后,它的 readyState 属性将变为 0,status 属性也会变为 0。

案例代码:

// 创建XMLHttpRequest对象
const xhr = new XMLHttpRequest();
// 请求地址
const url = "https://developer.mozilla.org/";
// 初始化请求
xhr.open('GET', url, true);
// 发送请求
xhr.send();
// 监听取消请求
xhr.addEventListener('abort', function () {
	console.log('请求被abort()取消了');
});
// 定时器模拟取消请求
setTimeout(() => {
	// 取消请求
	xhr.abort();
	// 取消请求之后的状态status
	console.log('abort()之后的xhr.status---', xhr.status);
	// 取消请求之后的状态readyState
	console.log('abort()之后的xhr.readyState---', xhr.readyState);
}, 100);

fetch 终止请求

使用 AbortController 可以中断 Fetch 请求。AbortController 是一个新的 Web 标准,用于中止 DOM 请求和 Fetch 请求。在执行 Fetch 请求时,可以通过 AbortController 创建一个信号对象 signal,并将 signal 作为配置选项传递给 fetch() 方法,这样就可以通过调用 AbortController 对象的 abort() 方法来中止请求。

案例代码:

const controller = new AbortController();
const { signal } = controller;
// 请求地址
const url = "https://developer.mozilla.org/";
fetch(url, { signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 中止 fetch 请求
controller.abort();

axios 终止请求

AbortController(新版本)

从 axios 的 0.22.0 版本开始,推荐使用浏览器原生的 AbortController 来终止请求。当使用该方法终止请求时,如果请求正在处理中,则会中止该请求;如果请求已经完成(即已经接收到完整的响应),则不会执行任何操作。

我们可以通过两种方式来监听终止请求的操作并进行后续处理:

  • 使用 AbortController 提供的 onabort 事件,通过监听该事件并绑定事件处理函数,在函数中执行后续处理逻辑。
  • 使用 try…catch,终止请求后会触发 catch,可以在 catch 中进行后续处理。如果同时使用 onabort 事件和 try…catch,则会先触发 onabort 事件,再触发 try…catch。

案例代码:

// 以vue项目中使用axios为例
// 创建请求控制器 
this.controller = new AbortController();
console.log("初始声明的请求控制器------", this.controller);

const url = "https://developer.mozilla.org/";
// 第一种方法:绑定事件处理程序
this.controller.signal.addEventListener("abort", () => {
   console.log("请求已终止,触发了onabort事件");
   // 进行后续处理
});

// 第二种方法:try...catch
try {
    // 发送文件上传请求
    const res = await this.$axios.post(url, {}, {
     timeout: 0, // 设置超时时间为 0/null 表示永不超时
     signal: this.controller.signal, // 绑定取消请求的信号量
	});
} catch (error) {
    console.log("终止请求时catch的error---", error);
    // 判断是否为取消上传
    if (error.message == "canceled"){
        // 进行后续处理
    };
}

// 终止请求
this.controller.abort();
console.log("终止请求后的请求控制器------", this.controller);

需要注意的是,每个 AbortController 可以同时取消多个请求,但只能取消请求一次。终止请求后,该请求的 signal.aborted 属性会从 false 变为 true。目前,暂无方法可以将其恢复为 false。如果后续请求仍然绑定了该请求控制器,那么后续请求都会被提前终止,不会被发送。

如果想要在终止请求后不影响后续请求的正常发送,并且后续请求也能够被终止,需要在每次发送请求之前都通过构造函数创建一个新的 AbortController,并将每次请求绑定到新的 AbortController 上,以确保多次请求之间不会相互干扰。

CancelToken( axios 旧版本)

在 axios 的 0.22.0 版本之前,可以使用取消令牌(CancelToken)来中止请求。不过,从 0.22.0 版本开始,该 API 已被弃用,不再建议使用。当使用该方法终止请求时,如果请求正在处理中,则会中止该请求;如果请求已经完成(即已经接收到完整的响应),则不会执行任何操作。

该方法只能通过try…catch来监听取消请求操作,终止请求之后,会触发catch,在catch中进行后续处理。而且该方法在取消请求时,可以通过参数自定义catch的error中的message内容。

案例代码:

// 以vue项目中使用axios为例

// 这个地方需要导入原生的axios 最好不要使用二次封装后的axios
import axios from "axios";
const url = "https://developer.mozilla.org/";
// 创建请求令牌
this.source = axios.CancelToken.source();
console.log("初始声明的请求令牌---", this.source);

// 第二种方法:try...catch
try {
    // 发送文件上传请求
    const res = await this.$axios.post(url, {}, {
     timeout: 0, // 设置超时时间为 0/null 表示永不超时
     cancelToken: this.source.token, // 绑定取消请求的令牌
	});
} catch (error) {
    console.log("终止请求时catch的error---", error);
    // 判断是否为取消上传
    if (error.message == "自定义取消请求的message"){
        // 进行后续处理
    };
}

// 终止请求
this.source.cancel("自定义取消请求的message");
console.log("取消请求后的请求令牌---", this.source);

注意:该方法与AbortController相同,都可以同时取消多个请求,但是只能取消请求一次,一个CancelToken在终止过请求之后,如果后续请求还是绑定该请求令牌,则后续请求都会被提前终止,不会被发出。

同理,如果我们想要在终止请求之后,不影响后续请求的正常发出,且后续请求也是可以被终止的,那么需要在每次发出请求之前,都创建一个新的的 CancelToken,每次请求绑定的都是新的CancelToken,这样才能做到多次请求之间不干扰。文章来源地址https://www.toymoban.com/news/detail-758307.html

到了这里,关于前端如何中断请求 ( axios、原生 ajax、fetch)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 前端开发中的ajax请求、axios封装

    前端开发中的ajax请求、axios封装

    目录 浏览器http请求 同步 js标签跨域、url 异步ajax、websock协议 ajax是异步的技术术语,最早的api是xhr(XMLHttpRequest) fetch es6 api axios 封装axios(无论用requst还是axios请求都会生效) src/utils/request.ts请求/响应拦截器封装 ts post请求request.post(url)和 通用请求request({url,method:\\\'post\\\'})对象

    2024年02月11日
    浏览(26)
  • 前端终止请求的三种方式(ajax、axios)

    前端终止请求的三种方式(ajax、axios)

    一、原生ajax终止请求 1、abort() ​ XMLHttpRequest.abort() 方法用于终止 XMLHttpRequest 对象的请求,该方法没有参数,也没有返回值。当调用该方法时,如果对应 XMLHttpRequest 对象的请求已经被发送并且正在处理中,则会中止该请求;如果请求已经完成(即已经接收到完整的响应),则

    2024年02月09日
    浏览(13)
  • axios 或 fetch 如何实现对发出的请求的终止?

    终止 HTTP 请求是一个重要的功能,特别是在需要优化性能、避免不必要的请求或在某些事件发生时(例如用户点击取消)中断正在进行的请求时。以下是如何使用 axios 和 fetch 实现请求终止的方法: 1. axios axios 使用了 CancelToken 来支持取消请求。 以下是使用 axios 取消请求的例

    2024年02月10日
    浏览(10)
  • javascript常见100问|前端基础知识|问ajax-fetch-axios-区别请用 XMLHttpRequestfetch 实现 ajax节流和防抖px em rem vw/箭头函数的缺点

    HTML CSS JS HTTP 等基础知识是前端面试的第一步,基础知识不过关将直接被拒。本章将通过多个面试题,讲解前端常考的基础知识面试题,同时复习一些重要的知识点。 扎实的前端基础知识,是作为前端工程师的根本。基础知识能保证最基本的使用,即招聘进来能干活,能产出

    2024年04月27日
    浏览(16)
  • 【Ajax】如何通过axios发起Ajax请求

    【Ajax】如何通过axios发起Ajax请求

    ✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学   Node.js教学 从头开始学习   ajax学习 Axios是专注于网络数据请求的库,相比于原生的XMLHttpRequest对象,axios简单易用。相比于Jquery,axios更加轻量化,只专注于网络数据请

    2024年02月02日
    浏览(19)
  • Ajax fetch Axios 的区别

    AJAX:一种创建交互式网页应用的网页执行交互技术 通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。意味着:在不重新加载整个网页 的情况下,对网页某部分进行更新。 缺点: 针对MVC编程,不符合前端MVVM;基于原生XHR;配置和调用方式非常混乱,基于

    2024年02月11日
    浏览(10)
  • ajax、axios、fetch的区别

    参考答案: ajax 是指一种创建交互式网页应用的网页开发技术,并且可以做到无需重新加载整个网页的情况下,能够更新部分网页,也叫作局部更新。 使用 ajax 发送请求是依靠于一个对象,叫 XmlHttpRequest 对象,通过这个对象我们可以从服务器获取到数据,然后再渲染到我们

    2024年02月14日
    浏览(9)
  • Ajax、Fetch、Axios三者的区别

    概念:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。是一种网络请求的概念框架。 主要特点:实现页面局部刷新,主要使用js的XMLHttpRequest请求实现网络请求。 主要缺点:使用函数回调的方式实现异步请求,若请求里写请求将会导致回调地狱的发生。 示例代码: 概念:

    2024年04月15日
    浏览(11)
  • 前端异步请求并解决跨域问题(Ajax+axios框架)、后端响应多个数据(JSON)

    前端异步请求并解决跨域问题(Ajax+axios框架)、后端响应多个数据(JSON)

    目录 一、前后端同步异步请求 1.同步请求: 2.异步请求: 3.跨域问题(前端问题) 4.axios框架(封装后) 二、后端向前端响应多个数据-JSON 1.同步请求:         发送一个请求,回应请求,回应的内容会覆盖浏览器中的内容,这样会 打断 前端其他的正常操作。 2.异步请求:

    2024年02月07日
    浏览(13)
  • JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

    JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

    早期的网页都是通过后端渲染来完成的,即服务器端渲染(SSR,server side render): 客户端发出请求 - 服务端接收请求并返回相应HTML文档 - 页面刷新,客户端加载新的HTML文档; 服务器端渲染的缺点: 当用户点击页面中的某个按钮向服务器发送请求时,页面本质上只是一些数

    2024年02月16日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包