Fetch和XHR有什么区别?
区别:
-
原生API vs ES6新增函数
:XHR 是浏览器提供的原生API,而 fetch 是 ES6 中新增的全局函数。 -
使用对象差异
:XHR 使用 XMLHttpRequest 对象,而 fetch 使用 Promise 对象。 -
Cookies 默认携带
:fetch 默认不会携带 cookies,需要手动设置 credentials 属性;而 XHR 请求会自动携带 cookies。 -
请求取消能力
:XHR 可以取消一个正在进行的请求,而 fetch 目前没有原生的请求取消机制。 -
响应类型处理
:XHR 的 responseType 属性可以设置响应类型(text、json、blob 等),而 fetch 需要手动解析响应。 -
进度监听功能
:XHR 可以监听上传和下载的进度,而 fetch 不支持此功能。 -
错误处理方式
:在错误处理方面,fetch 只会在网络错误时 reject Promise,其他错误都会被视为成功的响应,需要手动判断;而 XHR 则会在出现错误时 reject Promise。 -
兼容性
:XHR 兼容性更好,在一些旧版本的浏览器中可能无法使用 fetch。
代码示例:
使用 XHR 发送 GET 请求:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); console.log(response); } }; xhr.send();
一些解释:
xhr.open
的第三个参数是用于指示请求是否为异步的布尔值。
如果将它设置为true
,则表示该请求是异步
的,JavaScript 会在请求发送后继续执行并等待响应。
如果设置为false
,则表示该请求是同步
的,JavaScript 会在发送请求后一直等待直到收到响应为止。
XMLHttpRequest 对象的 readyState 属性表示请求的状态,status 属性表示 HTTP 状态。
readyState 的可能取值包括:
0
: 未初始化,尚未调用 open 方法
1
: 启动,已经调用 open 方法,但尚未调用 send 方法
2
: 发送,已经调用 send 方法,但尚未接收到响应
3
: 接收,已经接收到部分数据
4
: 完成,已经接收到全部数据,并且可以在客户端使用
status 的可能取值包括(部分常见的):
200
: 请求成功
404
: 未找到页面
500
: 服务器内部错误
302
: 重定向等
使用 fetch 发送 GET 请求:
fetch('https://api.example.com/data') .then(function(response) { if (response.ok) { return response.json(); } else { throw new Error('Network response was not ok.'); } }) .then(function(data) { console.log(data); }) .catch(function(error) { console.log(error); });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)