从 ajax 到 axios

XMLHttpRequest 对象

const xhr = new XMLHttpRequest();

xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
  }
};

const url = "http://www.baidu.com/";
xhr.open("post", url, true); //初始化
const body = {
  data: {
    a: 1,
  },
};

xhr.send(body);

xhr.onload = function () {
  // 请求结束后, 在此处写处理代码
  console.log("请求成功", xhr.responseText);
};

// 当网络不佳时,我们需要给请求设置一个超时时间

// 超时时间单位为毫秒
xhr.timeout = 1000;

// 当请求超时时,会触发 ontimeout 方法
xhr.ontimeout = () => console.log("请求超时");
  • xhr.readyStatus==0 尚未调用 open 方法

  • xhr.readyStatus==1 已调用 open 但还未发送请求(未调用 send)

  • xhr.readyStatus==2 已发送请求(已调用 send)

  • xhr.readyStatus==3 已接收到请求返回的数据

  • xhr.readyStatus==4 请求已完成

XMLHttpRequest.responseType 属性是一个枚举属性, 返回响应式数据的类型.

responseType 支持以下几种值:

  • "" responseType 为空字符串时,采用默认类型 DOMString,与设置为 text 相同。

  • arraybuffer response 是一个包含二进制数据的 JavaScript arrayBuffer

  • blob response 是一个包含二进制数据的 blob 对象

  • document response 是一个 html document 或 xmldocument, 这取决于接收到的数据的 mime 类型.

  • json response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的

  • text response 是一个以 DOMString 对象表示的文本。

ajax

fetch

Fetch API 也能像 XHR 那样中断一个请求了,只是稍微绕了一点。通过创建一个 AbortController 实例,我们得到了一个 Fetch API 原生支持的控制中断的控制器。这个实例的 signal 参数是一个 AbortSignal 实例,还提供了一个 abort() 方法发送中断信号。只需要将 signal 参数传递进 fetch() 的初始化参数中,就可以在 fetch 请求之外控制请求的中断了:

过去 FileReader 只能在 onload 事件上拿到整个文件的数据,或者对文件使用 slice() 方法得到 Blob 文件片段。

axios

我们可以为 axios 处理一下错误

取消请求

  1. 创建 CancelToken 对象: 在发起请求之前,可以通过 axios.CancelToken.source() 方法创建一个 CancelToken 对象,并获取其中的 token。这个 token 是一个用于标识该请求的令牌。

  2. 关联 CancelToken: 将创建的 CancelToken 对象中的 token 关联到请求的配置中,通过 cancelToken 参数。这告诉 Axios 在取消令牌触发时要取消这个请求。

  3. 取消请求: 当想要取消请求时,调用 CancelToken 对象中的 cancel 方法,并提供一个取消的原因。这会触发 Axios 内部的逻辑,导致底层的网络请求被中止。

  4. 捕获取消错误: 如果请求在取消前已经发出,Axios 会抛出一个名为 Cancel 的错误。可以使用 axios.isCancel(error) 来检查是否是取消错误。在 .catch 部分处理这个取消错误。

封装完成的取消请求

// 自己实现一个简略版的

demo

接下来是 ant-design-pro 的代码

封装层级深

最后更新于

这有帮助吗?