跳到主要内容

认识

2025年03月11日
柏拉文
越努力,越幸运

一、认识


二、问题


2.1 Ajax、Axios、Fetch 区别?

Ajax, 也是 XMLHttpRequest, 基于事件和回调函数, 通过 readyState 状态机来管理请求的各个阶段。通常在 readyState === 4(完成状态)时, 再判断 status 是否为 2xx 来确定请求成功。编写代码比较繁琐,容易陷入回调地狱,而且错误处理需要手动判断。Ajax 可以通过调用 ajax.abort() 来取消请求。Ajax 中的 progress 事件可以支持原生监测请求的进度, 如上传和下载的进度, 通过 (event.loaded / event.total) * 100 来计算进度。通过 ajax.response 或者 ajax.responseText 获取响应数据, 他们是同步的。

Fetch, 基于 Promise, 返回一个 Response 对象。请求成功不代表 HTTP 状态一定在 2xx 范围内,所以需要检查 response.ok 属性, 该属性为 true 时状态码位于 200-299 范围内, HTTP 错误(如 404500), 也会进入到 .then 中。Fetch 需要借助 AbortController 来取消请求, 创建一个 AbortController 对象,该对象提供了一个 signal 属性, 在调用 fetch 时, 将 AbortControllersignal 作为配置项传入, 当需要取消请求时, 调用 AbortControllerabort() 方法, 此时,该 signal 关联的所有 fetch 请求会被中止, 并抛出一个 AbortError 异常。fetch 没有原生的请求进度监测方法。如果必须使用 Fetch 检测进度, 可以考虑将大文件拆分成多个小块, 分别上传,并自行计算总体进度。缺点是需要额外管理分块和合并逻辑,代码复杂度会提高。通过 response.json() 或者 response.text() 获取文本, 并且他们是异步的。

Axios 同样基于 Promise, 但提供更丰富的配置项和拦截器。内置对 HTTP 错误的处理, 当响应状态码不是 2xx 时会自动 reject。此外,Axios 提供了请求和响应拦截器,可以在请求发出或响应返回前做统一的处理。 Axios 内置了取消请求的机制(通过 Cancel TokenAbortController 的新版支持)。