【查漏补缺】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

相关文章
|
前端开发 JavaScript
前端 fetchMetadata: sill fetchPackageMetaData error for detec卡住解决办法
前端 fetchMetadata: sill fetchPackageMetaData error for detec卡住解决办法
2164 0
|
1月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
89 0
|
5月前
|
JavaScript 前端开发 网络协议
前端JS发起的请求能暂停吗?
在讨论前端JS发起的请求是否能暂停时,需要明确两个概念:什么状态可以被认为是“暂停”?以及什么是JS发起的请求?
485 1
前端JS发起的请求能暂停吗?
|
5月前
|
存储 监控 Serverless
函数计算操作报错合集之实例请求Header里面带 "xweb_xhr: 1" 就出现超时,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
4月前
|
JSON 数据格式
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
|
6月前
|
前端开发 数据可视化 Dubbo
深入解析 Axios 取消请求:2 种方法助你掌握控制权
在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用 Axios 发送请求时取消这些请求。
深入解析 Axios 取消请求:2 种方法助你掌握控制权
|
前端开发
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理2
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理2
51 0
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理2
|
前端开发
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理1
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理1
49 0
|
前端开发
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理3
前端学习笔记202307学习笔记第六十一天-axios取消请求工作原理3
45 0
|
前端开发
前端学习笔记202307学习笔记第六十一天-axios取消请求的功能2
前端学习笔记202307学习笔记第六十一天-axios取消请求的功能2
51 0