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的内容。

我们注意两个地方,一个代表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>

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

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

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

兼容性

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

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

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

  1. dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...

  2. 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程

    作者:Smity 合天智汇 去年的强网杯,出了一道mysql堆叠注入叫随便注,这道题被好多比赛玩了一整年,直到现在还是有各种新姿势,但是今天我忽然想到似乎没有对这个题目有一个很认真的分析,因此这里总结 ...

  3. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  4. 返回值_关于GWLP_WNDPROC的那些奇怪的返回值

    关于魔法数字 我们可以使用如下的方法来获取窗口当前使用的窗口过程. 兼容32位和64位Windows版本:GetWindowLongPtr(hwnd, GWLP_WNDPROC)仅在32位Window ...

  5. ajax成功进入success但是获取不到返回值

    一.前言 最近做前端的时候,发现个奇怪的问题,ajax获取不到返回值了,问题是还是会到success中,也是可以正常打印的,就是没有response,奇怪. 二.正文 1.首先是不走success的问 ...

  6. python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),

    案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...

  7. php 获取返回值,求助 如何获取php socket 返回值

    使用抓包工具可以看到,就是页面获取不到返回值,怎么办?? function Send_socket_connect($service_port, $address, $in) { header(&qu ...

  8. 在 C# 中如何获取存储过程的返回值 ?

    咨询区 GurdeepS: 我有下面的查询语句: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON goALTER PROCEDURE [dbo].[Validat ...

  9. .Net (C#)委托和事件(获取多个返回值)

    From: http://www.xuebuyuan.com/841530.html 在讲如何获取多个返回值之前先来看一个小例子: private void button1_Click(object ...

最新文章

  1. python输入input的用法
  2. 网站优化基础教程:发布外链常见的五种方式!
  3. Zepto源码分析-架构
  4. Codeforces732D Exams
  5. 分布式服务框架原理(一)设计和实现
  6. C/C++入门易错点及常用小技巧
  7. angularjs的基础知识
  8. Elasticsearch--入门-_cat命令查看节点相关信息---全文检索引擎ElasticSearch工作笔记004
  9. 定义化标签之文本元素
  10. 手机号 验证函数 C++
  11. 爬取搜狗微信文章笔记2
  12. 先一XDB实时数据库采集
  13. python columns函数_pandas 对 column 使用函数
  14. 产品经理入门攻略(3岁的PM成长分享)
  15. 晨曦 - 江湖一剑客
  16. 地形建模(一)——TIN地形的生成
  17. web前端html实例-Html5实现的语音搜索功能
  18. Scala可变长度参数和:_*使用
  19. Ubuntu安装Typora(md文件)
  20. Top-down Visual Saliency Guided by Captions阅读笔记

热门文章

  1. pow(x,n) leecode
  2. android 多选项实现
  3. js 数字千分位展示
  4. 自定义安装mysql linux_linux下 安装mysql 问题
  5. python学多久能写东西的软件有哪些_怎么自学python,大概要多久?
  6. mysql保存plc数据_MySQL空间数据的保存
  7. while语法php格式,PHP While 循环
  8. php v9 如何获取超级管理员权限,Windows8.1如何获取超级管理员权限
  9. php 根号2计算过程,根号2以及π的计算--关于无理数的畅想
  10. 【OS学习笔记】三十三 保护模式九:分页机制对应的汇编代码之---用户程序代码