如何获取.then的返回值_仅仅知道如何终止XHR请求,或许对你来说是不够的!

TLDR:

当我们需要的时候,我们可以通过AbortController接口来终止一个或者多个请求。

前言

到目前为止,我们有两个常用的基本的手段去发送请求进而局部刷新页面内容,其一是XMR(XMLHttpRequest),其二是fetch,我们一个个说

XHR

对于XHR,我们或许已经很熟悉了,当我们想要发送一个请求的时候,我们可以这样做:

const xhr = new XMLHttpRequest();
const method = 'GET';
const url = 'https://xxx';xhr.open(method, url, true);
xhr.onreadystatechange = () => {if (xhr.readyState === 4) {// do something}
}
xhr.send();

当我们由于某种原因(比如重复请求)想要终止它的时候,我们只需要调用abort即可。

xhr.abort();

很方便也很简洁,但是对于fetch呢?

fetch

首先我们看下fetch的基本定义:

  • 接受一个必须的参数和一个可选的参数
  • 定义要获取的资源,地址或者Request对象
  • 可选的配置对象,比如请求方式、body、credentials等等,其中我们需要知道的是signal,他的定义如下: 一个AbortSignal对象实例,允许你通过AbortController与fetch请求通信或者终止fetch
  • 返回值是一个promise

看到这里我们已经知道了答案,但是我们需要再去了解一下上文所说的AbortController.

AbortController

最初es6引入fetch的时候,其实就是没有abort这样的功能,不过广大程序朋友们还会希望能有这个灵活的api,所以在2015年就有人提了这个issue,再次之后大家尝试了注入promise式的取消或者是其他hack等等,经过这份折腾最终我们迎来了AbortController和AbortSignal。

AbortController目前很简单,有一个制度的属性AbortController.signal和一个用来中断请求的.abort()

光说也没啥意思,咱看代码说话:

// 启动一个node服务,其中包括一个api和一个html页面const Koa = require('koa');
const fs = require('fs');
const app = new Koa();const sleep = () => {return new Promise(res => {setTimeout(function() {res();}, 3000);});
};app.use(async ctx => {if (ctx.request.url === '/api') {await sleep();ctx.body = 'Hello World';} else {ctx.status = 200;ctx.respond = false;fs.createReadStream('./test.html').pipe(ctx.res);}
});app.listen(3000);

下面是test.html的内容

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>fetch('/api').then((res) => {console.log(res, '请求成功');});</script>
</body>
</html>

启动服务后,我们看下network的内容。

cdf091ed509ef7c3a2eaa643a072db25.png

我们注意两个地方,一个代表fetch请求,一个代表请求的延时时间,也就是我们定义的三秒

取消fetch

这时候我们想中断,就可以这样做:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>// 增加了如下几行const controller = new AbortController();const signal = controller.signal;console.log(signal, 'signal的初始状态');signal.addEventListener('abort', function (e) {console.log(signal, 'signal的中断状态');});setTimeout(function() {controller.abort();}, 2000);// 增加部分结束fetch('/api', {signal}).then((res) => {console.log(res, '请求成功');});</script>
</body>
</html>

再次运行,我们会得到如下结果:

4b3a85ef37a089e28efd93340719ff4e.png

d54e57e0295ca96185760dd3c02e4f80.png

从图中我们可以很清楚的看到,请求在2s后被终止,请求状态变为canceled,然后aborted的状态由false转变为true。

就是这样,我们对fetch也进行的取消操作,还算是豁然开朗吧。嘻嘻。

兼容性

虽然AbortController已经诞生很长时间了,但是目前mdn上的定义还是实验性技术,查看mdn我们可以发现,其实主流浏览器大部分都支持了,如果我们开发的平台很新还是可以使用的,相信不远的将来,肯定会大批量使用。前端的道路也会越来越顺畅!

23fd74c0be2da86f0a13b78c43e538ff.png

最后如果这边文章能帮给你带来一点帮助,欢迎关注,点赞,制作不易,与君共勉!

26abcc7ff30f31c48573e4812f618edc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java - 常用工具类 - 集合框架

转载于:https://www.cnblogs.com/wnzhong/p/9309371.html

stunnel使用详解

http://www.stunnel.org/faq/args.htmlhttp://www.colasoft.com.cn/support/monitor_stunnel.php科来网络分析系统与stunnel结合使用科来网络分析系统是一款强大的网络检测分析工具&#xff0c;可对网络中未加密的数据传输进行检测分析并实时显示分析结果&#xff0c;包括用户的…

binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据

前言“删库跑路”是程序员经常谈起的话题&#xff0c;今天&#xff0c;我就要教大家如何删&#xff01;库&#xff01;跑&#xff01;路&#xff01;开个玩笑&#xff0c;今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复&#xff0c;读完本文&#xff0c;你…

Java并发编程笔记之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露&#xff0c;是什么原因导致的内存泄漏呢&#xff1f; 我们首先看一个例子&#xff0c;代码如下&#xff1a; /*** Created by cong on 2018/7/14.*/ public class ThreadLocalOutOfMemoryTest {static class LocalVariable {private L…

Res协议,专题

打造完美的&#xff29;&#xff25;网页木马 发表&#xff1a;2004-5-20 19:41:00 出处&#xff1a;你的博客网(yourblog.org) 打造完美的&#xff29;&#xff25;网页木马 icyfox &#xff08;测试页面:http://www.godog.y365.com/runexe/icyfox.htm&#xff0c;此处所…

springboot中获取bean_最新Spring Boot干货总结(超详细,建议收藏)

前言&#xff1a;本文非常长&#xff0c;建议先mark后看&#xff0c;也许是最后一次写这么长的文章说明&#xff1a;前面有4个小节关于Spring的基础知识分别是&#xff1a;IOC容器、JavaConfig、事件监听、SpringFactoriesLoader详解它们占据了本文的大部分内容&#xff1a;虽然…

python全栈学习总结三:函数学习

一函数基本概念 1 函数定义 def 函数名&#xff08;参数1&#xff0c;参数2&#xff0c;参数3&#xff0c;......&#xff09;: """ 功能&#xff1a; 参数1&#xff1a; 参数2&#xff1a; 参数3&#xff1a; ...... 返回值&#xff1a; """ 函…

街机模拟器联网简谈

Kawaks联网教程现在大多数模拟器的联网功能主要是靠"kaillera"来实现的,要想实现联网玩游戏,你必须有一个kaillera的客户端和一个服务器端的程序,客户端现在大多在模拟器中自带,而服务器端则是一个单独的程序.kaillera有多种操作系统,而大多是在windows下,好了废话不…

freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

最近因为工作需要用到FreeRTOS&#xff0c;其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程&#xff0c;但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的&#xff0c;这个道理就像公司内心深处不想给你涨工资一样。好了跑偏了言…

破解静态WEP KEY全过程

破解静态WEP KEY全过程广州卓讯盟科技有限公司 黄超毅Email:huangchaoyigzpia.com/demonalexdark2s.org发现首先通过NetStumbler确认客户端已在某AP的覆盖区内&#xff0c;并通过AP信号的参数进行‘踩点’&#xff08;数据搜集&#xff09;。NetStumbler 下载地址 http://www.n…

apicloud项目怎么运行_Spring Boot教程(3) – 运行第一个项目

把项目运行起来是极具成就感的事情&#xff0c;不管是在学习新语言还是新框架的过程中。上一篇文章说明了如何使用Spring Initializr和IDE来创建项目&#xff0c;下面就看看项目能不能跑起来&#xff0c;我们通过IDE和命令行&#xff0c;直观地理解框架的作用。先来一张Intelli…

Matlab从入门到精通 Chapter5 数据可视化

5-1 图形绘制示例 >> x2-17:0.02:3;>> y21./((x23).^21)1./((x29).^24)5; >> subplot(2,2,2);>> plot(x2,y2,rp);>> axis([-17 3 5 6.5]);>> title(figure2);>> grid on subplot 子图表绘制函数 默认情况下&#xff0c;plot函数将绘…

破解WEP密钥过程全解 (下)

三、实战破解过程1、用Kismet进行网络探测Kismet是一个基于Linux的无线网络扫描程序&#xff0c;这是一个相当方便的工具&#xff0c;通过测量周围的无线信号来找到目标WLAN。虽说Kismet也可以捕获网络上的数据通信&#xff0c;但在还有其他更好的工具使用(如Airodump)&#xf…

mpAndroidchart 坐标和图表距离_【玩转图表系列】六步,美化你的图表,让老板刮目相看!...

近期隆重推出图表分析系列&#xff0c;包括销售分析、盈亏分析、费用分析、趋势分析、进度分析等&#xff0c;通过双坐标图、甘特图、瀑布图、双层饼图等系列图表精美展现&#xff0c;专业高效&#xff0c;让你从初级学到高级、从小白跨越专业。今天开启我们邦邦财玩转图表第一…

SpringBoot+FreeMarker开发word文档下载,预览

背景&#xff1a; 开发一个根据模版&#xff0c;自动填充用户数据并下载word文档的功能 使用freemarker进行定义模版&#xff0c;然后把数据进行填充。 maven依赖&#xff1a; <parent> <groupId>org.springframework.boot</groupId> <artifactId>…

使用 IPsec 与组策略隔离服务器和域-第 7 章 IPsec 疑难解答

本章提供有关如何对 Internet 协议安全性 (IPsec) 问题&#xff08;如服务器和域隔离方案中的安全性问题&#xff09;进行疑难解答的信息&#xff0c;这些信息依赖于 Microsoft 信息技术 (IT) 小组的经验和方法。 在有可能的时候&#xff0c;本章将引用现有的 Microsoft 疑难解…

单片机的单个IO口可以发送数据吗_关于51单片机各个引脚它的功能你了解多少?...

对于40引脚双列直插51单片机各个引脚功能情况分析。P0端口一默认是开漏准双向IO口&#xff0c;没有输出没有驱动能力&#xff0c;要做逻辑输出要在外部接上拉电阻。P0端口除了作为普通的输入输出功能&#xff0c;还可以用来当做数据总线接口或者地址总线&#xff0c;当外面扩展…

git merge用法_常用命令之git操作(进阶篇)

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。有人把 Git 的分支模型称为必杀技特性&#xff0c;而正是因为它&#xff0c;将 Git 从版本控制系统家族里区分出来。不同的分支可以理解为…

2G内存刚刚好 浅谈4G内存对笔记本的影响

随着Intel P3x系列芯片组的发布&#xff0c;DDR3内存的普及日益临近&#xff0c;AMD K10系列处理器AM2规格也正式支持DDR3内存&#xff0c;明年即将面临淘汰的DDRII内存是越来越便宜了。很多笔记本用户在购买笔记本的时候都把是否支持4G内存作为一个总要的衡量标准。官方资料里…

由object元素引出的事件注册问题和层级显示问题

项目有一个双击监控视频全屏的需求&#xff0c;视频播放使用的是IE下的ActiveX控件&#xff0c;web页面中使用HTML嵌入对象元素object。预期方案如下&#xff1a; 1.在开发ActiveX控件时加入双击事件。 2.通过div包裹object&#xff0c;控制div的大小从而间接实现全屏效果。 在…