深入理解Axios源码:取消请求机制剖析
2023-09-12 23:37:54
Axios源码阅读(三):取消请求
在Axios这样的网络请求库中,取消请求是非常重要的一个特性。本文将通过阅读Axios的源代码,来介绍Axios是如何实现取消请求的。
本文将主要介绍以下两方面:
- 使用
CancelToken
取消请求 - 使用
AbortController
取消请求
使用 CancelToken
取消请求
CancelToken
是一个用来创建和管理取消请求令牌的类。使用CancelToken
取消请求的步骤如下:
- 创建一个
CancelToken
实例。 - 将
CancelToken
实例传递给Axios
请求配置中的cancelToken
属性。 - 当需要取消请求时,调用
CancelToken
实例的cancel()
方法。
例如:
const source = Axios.CancelToken.source();
const request = Axios.get('/api/example', {
cancelToken: source.token,
});
source.cancel();
当调用source.cancel()
方法时,CancelToken
实例将进入cancelled
状态,并触发所有关联的Axios
请求的cancel
事件。
CancelToken
的设计模式
CancelToken
的设计模式是观察者模式 。当一个CancelToken
实例被创建时,它会创建一个Emitter
实例,用于管理事件监听器。当cancel()
方法被调用时,Emitter
实例会触发cancel
事件,通知所有监听器取消请求。
使用 AbortController
取消请求
AbortController
是一个用来创建和管理中止请求信号的类。使用AbortController
取消请求的步骤如下:
- 创建一个
AbortController
实例。 - 获取
AbortController
实例的signal
属性,并将其传递给Axios
请求配置中的signal
属性。 - 当需要取消请求时,调用
AbortController
实例的abort()
方法。
例如:
const controller = new AbortController();
const request = Axios.get('/api/example', {
signal: controller.signal,
});
controller.abort();
当调用controller.abort()
方法时,AbortController
实例将触发AbortController
实例的abort
事件,并触发所有关联的Axios
请求的cancel
事件。
AbortController
的设计模式
AbortController
的设计模式是观察者模式 。当一个AbortController
实例被创建时,它会创建一个EventTarget
实例,用于管理事件监听器。当abort()
方法被调用时,EventTarget
实例会触发abort
事件,通知所有监听器中止请求。
比较 CancelToken
和 AbortController
CancelToken
和AbortController
都可以用来取消请求,但它们有一些不同的特点:
CancelToken
是专门为取消请求而设计的,而AbortController
还可以用来取消其他类型的操作,如超时或并行请求。CancelToken
可以创建多个令牌,而AbortController
只能创建一个信号。AbortController
在现代浏览器中受到更广泛的支持,而CancelToken
需要在较旧的浏览器中使用 polyfill。
总结
本文介绍了Axios中两种取消请求的方式:使用CancelToken
和使用AbortController
。这两种方法都可以实现取消请求,但它们在设计模式和支持的浏览器方面有所不同。开发人员可以根据自己的需求选择适合自己的取消请求方式。