【查漏补缺】fetch请求是可以取消的

简介: 【查漏补缺】fetch请求是可以取消的

640.jpg

写在前面


在网页中,Ajax和Fetch是最常用的发起网络请求的两种方式。在面试中,关于这两者的区别也会被提及。你也许听说过这么一个说法,Ajax是可以取消的,Fetch是不可以取消的。真的是这样吗?


取消Ajax


使用ajax发起一个网络请求的代码大致如下:


var xhr = new XMLHttpRequest();xhr.open("GET", url);xhr.onreadystatechange = function(){};xhr.send();


想要中断这个ajax请求,可以直接调用


xhr.abort()


640.jpg


取消fetch


使用fetch发起一个网络请求的代码大致如下:


fetch(url)    .then(r => r.json())    .then(response => {
    })    .catch(err => {        console.error("Error in fetching!", err);    });


fetch是基于promise的,可以在页面主线程、worker等地方使用,十分的方便。

想取消一个fetch请求,可以使用AbortController.

AbortController代表一个控制器对象,允许你在需要时中止一个或多个DOM请求。直接来看示例代码:


var controller = new AbortController();var signal = controller.signal;
// 将signal传入fetch的第二个参数fetch(url, { signal })   .then(function(response) {    ...  }).catch(function(err) {    if (err.name === 'AbortError') {      console.log('Fetch was aborted');    } else {      console.error('Oops!', err);    }  });  setTimeout(() => {  controller.abort(); // 取消fetch请求}, 1000);


640.png


当我们主动取消fetch时,fetch的promise 会 reject 以下错误:


new DOMException('Aborted', 'AbortError')


这个时候,会进入fecth的catch逻辑块。

当然,如果fetch已经resolve了,我们就无法取消fetch了。


AbortController 当前的兼容性如下:


640.jpg


polyfills如下:

https://www.npmjs.com/package/abort-controller

https://www.npmjs.com/package/abortcontroller-polyfill


写在后面


取消网络请求是一个很重要的点,特别是在页面中有大量请求,而用户切到其他页面时,适当的取消pending中的网络请求,可以减少网络资源的浪费和页面卡顿,提升用户体验。fetch,也是可以取消的。

最后,推荐一个不错的fetch库:

https://github.com/misaka-ink/fetch2

相关文章
|
Web App开发 JavaScript Java
浏览器同域名请求的最大并发数限制
  当我们在浏览网页的时候,对浏览速度有一个重要的影响因素,就是浏览器的并发数量。并发数量简单通俗的讲就是,当浏览器网页的时候同时工作的进行数量。   如果同时只有2个并发连接数数量,那网页打开的时候只能依赖于这2条线程,前面如果有打开慢的内容,就会直接影响到后面的内容打开。
7094 0
|
存储 JSON 前端开发
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
1644 0
|
前端开发
前端base64转Blob,Blob转文件下载
前端将base64字符串转换为Blob对象,再将Blob对象转换为文件并实现下载。包括处理数据URL和纯base64字符串的情况,并提供了一个辅助函数用于转换。
575 3
|
消息中间件 NoSQL Java
使用Java实现分布式任务调度器
使用Java实现分布式任务调度器
|
SQL 人工智能 数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
1026 0
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
|
JSON JavaScript 前端开发
开发桌面程序-Electron入门
【10月更文挑战第16天】Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架,嵌入了 Chromium 和 Node.js。本文介绍了如何搭建 Electron 开发环境,包括安装 Node.js、创建项目、配置 main.js 和打包应用。通过简单的步骤,你可以快速创建并运行一个基本的 Electron 应用程序。
954 4
开发桌面程序-Electron入门
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
1976 0
|
数据采集 数据可视化 数据挖掘
学生成绩分析项目——数据分析与可视化
学生成绩分析项目——数据分析与可视化
1456 0
|
前端开发 JavaScript 编译器
Vite中预处理器(如less)的配置
【8月更文挑战第2天】Vite中预处理器(如less)的配置
1789 4
|
JavaScript
【UI】 elementUI的select-tree组合下拉框,选择后下拉框不收起
【UI】 elementUI的select-tree组合下拉框,选择后下拉框不收起
788 1