返回
在取消代码中使用 Axios 拦截器
前端
2023-12-11 14:46:51
我们来看看 CancelToken
模块。该模块中的源代码相对简单,包含了一个类和两个函数。首先我们看一下这个类。
// 定义CancelToken类
class CancelToken {
constructor(executor) {
if (typeof executor !== 'function') {
throw new TypeError('executor must be a function.');
}
let resolvePromise;
// CancelToken 通过构造函数接受一个 executor 函数。这个函数会立即执行,并传入一个 resolve 函数。
this.promise = new Promise((resolve) => {
resolvePromise = resolve;
});
//executor接收一个取消函数,在需要取消请求时调用它。当调用了该取消函数时,resolvePromise 将被调用,以使 promise 实例被解决。
executor((message) => {
if (this.reason) {
// 只要 promise 实例已经决议了,就什么都不做。
return;
}
this.reason = new Cancel(message);
// 设置 promise 实例的已决议状态,并传入取消的原因。
resolvePromise(this.reason);
});
}
//该方法返回与取消令牌关联的promise实例。如果请求被取消,这个 promise 实例将被决议,并传入取消的原因。
throwIfRequested() {
if (this.reason) {
throw this.reason;
}
}
// 该方法返回一个 source 对象,它包含一个 cancel 方法和一个 token 属性。token 属性是 CancelToken 实例,而 cancel 方法就是我们之前提到的取消函数。
static source() {
let cancel;
const token = new CancelToken((c) => {
cancel = c;
});
return {
token,
cancel,
};
}
}
CancelToken
类创建了一个 promise
实例,并提供了一个 throwIfRequested()
方法来检查是否取消了请求,如果取消了,则抛出错误。该类还提供了一个静态 source()
方法,返回一个包含 token
属性(CancelToken
实例)和 cancel
方法的对象。
接下来,我们来看看 Cancel
类。
// 定义 Cancel 类
class Cancel {
constructor(message) {
this.message = message;
}
}
Cancel
类是一个简单的类,用于表示请求被取消。它只有一个属性,message
,用于存储取消请求的原因。
最后,我们来看看 isCancel()
函数。
// 定义 isCancel 函数
function isCancel(value) {
return value && value.isAxiosError && value.config && !value.config.__isRetryRequest;
}
isCancel()
函数用于检查给定的值是否是 Cancel
对象。它首先检查该值是否存在,然后检查该值是否具有 isAxiosError
、config
和 __isRetryRequest
属性。如果所有这些检查都通过,则该值被认为是 Cancel
对象。
以上便是 Axios 源码中 CancelToken
模块的主要内容。这个模块用于处理请求的取消。CancelToken
类创建一个 promise
实例,并提供了一个 throwIfRequested()
方法来检查是否取消了请求,如果取消了,则抛出错误。该类还提供了一个静态 source()
方法,返回一个包含 token
属性(CancelToken
实例)和 cancel
方法的对象。Cancel
类用于表示请求被取消,它有一个 message
属性,用于存储取消请求的原因。isCancel()
函数用于检查给定的值是否是 Cancel
对象。