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

相关文章
|
2月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
149 0
|
6月前
|
前端开发 开发工具 git
大事件项目15----axios响应拦截器,统一判断401做被动退出
大事件项目15----axios响应拦截器,统一判断401做被动退出
|
5月前
|
JSON 数据格式
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
|
前端开发
前端学习笔记202307学习笔记第六十天-axios取消请求1
前端学习笔记202307学习笔记第六十天-axios取消请求1
48 0
|
7月前
|
前端开发 JavaScript 网络协议
【面试题】前端中 JS 发起的请求可以暂停吗?
【面试题】前端中 JS 发起的请求可以暂停吗?
|
7月前
|
前端开发 JavaScript
【面试题】如何取消 script 标签发出的请求
【面试题】如何取消 script 标签发出的请求
|
7月前
|
前端开发 数据可视化 Dubbo
深入解析 Axios 取消请求:2 种方法助你掌握控制权
在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用 Axios 发送请求时取消这些请求。
深入解析 Axios 取消请求:2 种方法助你掌握控制权
|
JavaScript 前端开发 API
axios如何取消请求,其原理是什么?
axios如何取消请求,其原理是什么?
498 0
|
前端开发
前端学习笔记202307学习笔记第六十天-axios取消请求2
前端学习笔记202307学习笔记第六十天-axios取消请求2
55 0
|
小程序 前端开发 JavaScript
小程序request请求回调函数异步的解决办法
小程序request请求回调函数异步的解决办法
247 0