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函数,该函数用来判断异常对象是不是取消原因对象,返回truefalse。我们在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混合对象添加CancelisCancel接口了,如下:

import Cancel from "./cancel/Cancel";
import isCancel from "./cancel/isCancel";
axios.Cancel = Cancel;
axios.isCancel = isCancel;

6. 修改之前的取消原因类型

我们现在创建取消原因Cancel类,所以我们需要将之前写的取消原因messagestring类型改成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接口的更多相关文章

  1. 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  2. 使用Typescript重构axios(十八)——请求取消功能:总体思路

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  3. 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. 使用Typescript重构axios(二十二)——请求取消功能:收尾

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  5. 使用Typescript重构axios(二十七)——添加请求状态码合法性校验

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 使用Typescript重构axios(二十八)——自定义序列化请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 使用Typescript重构axios(二)——项目起手,跑通流程

    0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...

  8. 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. 使用Typescript重构axios(四)——实现基础功能:处理post请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. linux分区与挂载

    分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用.分区表是一个硬盘分区的索引,分区的信息都会写进分区表.通常情况下,为磁盘分区通常使用fdisk,它是对基于MB ...

  2. session,cookie,sessionStorage,localStorage的相关设置以及获取删除

    一.cookie 什么是 Cookie? "cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScrip ...

  3. Java11月9日的动手动脑

    Java动手动脑 请自行编写代码测试以下特性(动手动脑): 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 程序源代码: package yanzhengjicheng; class ...

  4. 【JZOJ5248】花花的聚会

    Description 注意测试数据中道路是 到 的单向道路,与题面恰好相反. Input Output Sample Input 7 7 1 3 1 2 6 7 3 6 3 5 3 4 7 2 3 ...

  5. Django高级实战 开发企业级问答网站 ✌✌

    Django高级实战 开发企业级问答网站 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问 ...

  6. Flask中g对象,以及g,session,flash之间的区别

    一.g对象的使用 专门用来存储用户信息的g对象,g的全称的为global g对象在一次请求中的所有的代码的地方,都是可以使用的 g对象的使用: 设置:g.变量名= 变量值 获取:g.name 注意:g ...

  7. windows下bower init 报错: bower ENOINT Register requires an interactive shell

    windows下bower初始化时不应该在git bash中,而应该在cmd下打开的dos窗口中进行

  8. windows 7 专业版 64位 无法安装.Net 4.7版本解决方案

    什么暂停windows update,改文件夹,再恢复windows update等等方法都试了,不行之后就觉得这才是终极解决方案. 不管你是win 7什么版本,你只需要下载安装对应系统的Window ...

  9. opencv实践::对象计数

    问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...

  10. opencv::图像上采样和降采样

    图像金字塔概念 . 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔 . 一个图像金字 ...