【查漏补缺】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卡住解决办法
2155 0
|
5天前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
13 0
|
4月前
|
存储 监控 Serverless
函数计算操作报错合集之实例请求Header里面带 "xweb_xhr: 1" 就出现超时,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
3月前
|
JSON 数据格式
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
|
前端开发
前端学习笔记202307学习笔记第六十天-axios取消请求1
前端学习笔记202307学习笔记第六十天-axios取消请求1
43 0
|
5月前
|
前端开发 数据可视化 Dubbo
深入解析 Axios 取消请求:2 种方法助你掌握控制权
在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用 Axios 发送请求时取消这些请求。
深入解析 Axios 取消请求:2 种方法助你掌握控制权
|
JavaScript 前端开发 API
axios如何取消请求,其原理是什么?
axios如何取消请求,其原理是什么?
443 0
|
小程序 前端开发 JavaScript
小程序request请求回调函数异步的解决办法
小程序request请求回调函数异步的解决办法
238 0
|
前端开发
前端学习笔记202307学习笔记第六十天-axios取消请求2
前端学习笔记202307学习笔记第六十天-axios取消请求2
50 0
|
XML 安全 数据格式
测试妹子提了个bug,为什么你多了个options请求?
对于简单请求来说,如果请求跨域,那么浏览器会放行让请求发出。浏览器会发出cors请求,并携带origin。此时不管服务端返回的是什么,浏览器都会把返回拦截,并检查返回的response的header中有没有Access-Control-Allow-Origin是否为true,说明资源是共享的,可以拿到。如果没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。
201 0
测试妹子提了个bug,为什么你多了个options请求?