返回

在取消代码中使用 Axios 拦截器

前端

我们来看看 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 对象。它首先检查该值是否存在,然后检查该值是否具有 isAxiosErrorconfig__isRetryRequest 属性。如果所有这些检查都通过,则该值被认为是 Cancel 对象。

以上便是 Axios 源码中 CancelToken 模块的主要内容。这个模块用于处理请求的取消。CancelToken 类创建一个 promise 实例,并提供了一个 throwIfRequested() 方法来检查是否取消了请求,如果取消了,则抛出错误。该类还提供了一个静态 source() 方法,返回一个包含 token 属性(CancelToken 实例)和 cancel 方法的对象。Cancel 类用于表示请求被取消,它有一个 message 属性,用于存储取消请求的原因。isCancel() 函数用于检查给定的值是否是 Cancel 对象。