目前的JS项目的网络传输部分基本都被axios和新api fetch承包了,作为原生API的fetch一度被认为是XHR的更优解决方案,很大原因是其自带的Promise属性。
XHR 和 fetch() 的快速比较
先来看一个传统的XHR
1 | const xhr = new XMLHttpRequet() |
而fetch的实现如下1
2
3fetch('https://enter.chenhaotaishuaile.com/api/get_recent_posts')
.then((res) => res.json())
.then((data) => console.log(data))
Fetch的常见问题
- Fetch 请求默认是不带 cookie 的,需要设置 fetch(url, {credentials: ‘include’})
- 服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
主要在于第二点被一些开发人员所诟病,认为,请求返回错误也应该被Reject,但实际上是,我认为,这个措施跟XHRHttpRequest
的readyState和Status
分开处理一样道理的,都是为了分清楚错误源,更好的去排查是服务端方面的问题还是网络方面的问题,更重要的是,实际上如果遇到状态码规定不规范的情况,就更需要开发人员自行去确定这个请求是不是合法的了。