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接的详细内容...