使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
0. 系列文章
1.使用Typescript重构axios(一)——写在最前面
2.使用Typescript重构axios(二)——项目起手,跑通流程
3.使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
4.使用Typescript重构axios(四)——实现基础功能:处理post请求参数
5.使用Typescript重构axios(五)——实现基础功能:处理请求的header
6.使用Typescript重构axios(六)——实现基础功能:获取响应数据
7.使用Typescript重构axios(七)——实现基础功能:处理响应header
8.使用Typescript重构axios(八)——实现基础功能:处理响应data
9.使用Typescript重构axios(九)——异常处理:基础版
10.使用Typescript重构axios(十)——异常处理:增强版
11.使用Typescript重构axios(十一)——接口扩展
12.使用Typescript重构axios(十二)——增加参数
13.使用Typescript重构axios(十三)——让响应数据支持泛型
14.使用Typescript重构axios(十四)——实现拦截器
15.使用Typescript重构axios(十五)——默认配置
16.使用Typescript重构axios(十六)——请求和响应数据配置化
17.使用Typescript重构axios(十七)——增加axios.create
18.使用Typescript重构axios(十八)——请求取消功能:总体思路
19.使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式
20.使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式
21.使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
22.使用Typescript重构axios(二十二)——请求取消功能:收尾
23.使用Typescript重构axios(二十三)——添加withCredentials属性
24.使用Typescript重构axios(二十四)——防御XSRF攻击
25.使用Typescript重构axios(二十五)——文件上传下载进度监控
26.使用Typescript重构axios(二十六)——添加HTTP授权auth属性
27.使用Typescript重构axios(二十七)——添加请求状态码合法性校验
28.使用Typescript重构axios(二十八)——自定义序列化请求参数
29.使用Typescript重构axios(二十九)——添加baseURL
30.使用Typescript重构axios(三十)——添加axios.getUri方法
31.使用Typescript重构axios(三十一)——添加axios.all和axios.spread方法
32.使用Typescript重构axios(三十二)——写在最后面(总结)
1. 前言
虽然我们现在已经实现了官方axios请求取消功能的两种使用方式,但是官方axios上还有个isCancel接口还未实现。该接口接收一个异常对象e作为参数,用来判断该异常是否是由取消请求导致的,如果是的话该异常对象就应该是请求取消的原因;该接口实现起来也不难,我们可以创建一个取消原因Cancel类,而把请求取消的原因作为该类的实例,这样我们在捕获异常的时候只需判断异常对象是不是Cancel类的实例,如果是的话,那么它就是请求取消原因,否则就是其他异常。OK,思路就是这样,接下来,我们就来实现它。
2. 定义Cancel接口类型
创建cancel类之前,我们先在src/types/index.ts中定义接口类型,如下:
export interface Cancel {
message?: string
}
export interface CancelStatic {
new(message?: string): Cancel
}
我们先定义了Cancel类的实例对象类型Cancel,它里面只有一个属性,那就是取消原因message,接着还定义了Cancel类的类类型,它里面包含了构造函数属性,构造函数接收取消原因作为参数,返回Cancel类的实例对象。
3. 创建Cancel类
接口类型定义好之后,我们就来创建Cancel类,我们在src/cancel目录下创建Cancel.ts文件,在该文件内创建Cancel类,如下:
export default class Cancel {
message: string;
constructor(message:string){
this.message = message
}
}
该类的实现非常简单,就是实例化一个取消原因对象,该对象的message属性就是请求的取消原因。
4. 创建isCancel方法
创建好Cancel类之后,我们还应该创建一个isCancel函数,该函数用来判断异常对象是不是取消原因对象,返回true或false。我们在src/cancel目录下创建isCancel.ts文件,在该文件内创建isCancel函数,如下:
import Cancel from "./Cancel";
export default function isCancel(val:any):boolean {
return val instanceof Cancel
}
判断异常对象是不是取消原因对象,我们只需判断它是不是Cancel类的实例即可。
5. 添加Cancel和isCancel接口
创建好isCancel函数后,最后,我们将其添加到axios混合对象上,添加之前,还是要先在axios混合对象接口定义中添加isCancel属性,如下:
export interface AxiosStatic extends AxiosInstance {
create(config?: AxiosRequestConfig): AxiosInstance;
CancelToken: CancelTokenStatic;
Cancel: CancelStatic;
isCancel: (value: any) => boolean;
}
添加好接口类型以后,我们就可以在src/axios.ts中给axios混合对象添加Cancel和isCancel接口了,如下:
import Cancel from "./cancel/Cancel";
import isCancel from "./cancel/isCancel";
axios.Cancel = Cancel;
axios.isCancel = isCancel;
6. 修改之前的取消原因类型
我们现在创建取消原因Cancel类,所以我们需要将之前写的取消原因message从string类型改成Cancel类型。需要改动如下几个地方:
src/types/index.ts:
export interface CancelToken {
promise: Promise<Cancel>
reason?: Cancel
}
src/cancel/CancelToken.ts
import { Canceler, CancelExecutor, CancelTokenSource} from "../types";
import Cancel from "./Cancel";
interface ResolvePromise {
(reason?: Cancel): void;
}
export default class CancelToken {
promise: Promise<Cancel>;
reason?: Cancel;
constructor(executor: CancelExecutor) {
let resolvePromise: ResolvePromise;
this.promise = new Promise<Cancel>(resolve => {
resolvePromise = resolve;
});
executor(message => {
if (this.reason) {
return;
}
this.reason = new Cancel(message);
resolvePromise(this.reason);
});
}
static source(): CancelTokenSource {
let cancel!: Canceler;
let token = new CancelToken(c => {
cancel = c;
});
return {
cancel,
token
};
}
}
修改完之后,isCancel接口就算实现完毕了,接下来,我们就编写demo测试效果如何。
7. demo编写
我们继续沿用上篇文章的demo,只需在src/examples/cancel/app.ts文件中捕获异常的地方添加上本篇文章实现的异常对象判断即可,如下:
axios
.get("/api/cancel", {
cancelToken: new CancelToken(c => {
cancel = c;
})
})
.catch(function(e) {
// 新增
if (axios.isCancel(e)){
console.log(`请求取消原因:${e.message}`);
}
});
然后运行项目,我们打开 chrome 浏览器,访问 http://localhost:8000/ 即可访问我们的 demo 了,我们点击 cancel,通过F12的控制台中,我们看到取消原因已经被打印出来了。

(完)
使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口的更多相关文章
- 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(十八)——请求取消功能:总体思路
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十二)——请求取消功能:收尾
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十七)——添加请求状态码合法性校验
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十八)——自定义序列化请求参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二)——项目起手,跑通流程
0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...
- 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(四)——实现基础功能:处理post请求参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
随机推荐
- 超详细的FreeRTOS移植全教程——基于srm32
### 准备 在移植之前,我们首先要获取到FreeRTOS的官方的源码包.这里我们提供两个下载链接: > 一个是官网:http://www.freertos.org/ > 另外一个是代码托 ...
- 网络驱动之net_device结构体
在Linux系统中,网络设备都被抽象为struct net_device结构体.它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.3 ...
- restTemplate getForObject中map传参问题
在使用restTemplate中getForObject的map传参形式时: 开始时我是这么调用的: RestTemplate rest = new RestTemplate(); Map<St ...
- 自己动手撸一个LinkedList
自己动手撸一个LinkedList 1. 原理 LinkedList是基于双链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历.因此,Linked ...
- 常见Failed to load ApplicationContext异常解决方案!!
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- 使用ipython %matplotlib inline
首先讲讲这句话的作用,matplotlib是最著名的Python图表绘制扩展库,它支持输出多种格式的图形图像,并且可以使用多种GUI界面库交互式地显示图表.使用%matplotlib命令可以将matp ...
- 维护基于ASP.NET的网站的学习-SqlCommand类介绍及存储过程
笔者目前在维护学校科技处的一个网站,目前学期初,教师申报项目操作多,出现了一些问题.前几天维护了一个验证码图片不显示的bug,今天想记录下这个解决了一整天的bug-老师项目结题需要手动修改数据库老师项 ...
- python-函数相关
一.函数: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print(). 但你也可以自 ...
- POJ 1753 Flip Game(状态压缩+BFS)
题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...
- .NET进阶篇04-Serialize序列化、加密解密
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂这篇很轻松,没有什么费脑子的,所以解析较少,代码较多,为数不多的拿来即用篇整个章节分布请移步 内容目录 一.概述二.序列化1.二进制文件2.XML ...