Fetch API与XMLHttpRequest的比较
Fetch API与XMLHttpRequest的比较
我知道Fetch API使用Promise,而两者都允许你向服务器发送AJAX请求。
我已经阅读过Fetch API具有一些额外的功能,这些功能在XMLHttpRequest
中不可用(以及Fetch API的polyfill,因为它基于XHR
)。
Fetch API有哪些额外的功能?
admin 更改状态以发布 2023年5月23日
\n\n
fetch
\n
- \n
- 缺少内置方法消耗文档
- 目前还没有设置超时的方法yet
- 无法覆盖响应头的content-type
- 如果响应头中提供了content-length但没有公开,流传输过程中无法确定整个正文的长度
- 即使请求已完成,也会调用信号中的中止处理程序
- 没有上传进度(支持像
ReadableStream
这样的请求体暂时还未来临) - 不支持
--allow-file-access-from-files
(chromium)
\n
\n
\n
\n
\n
\n
\n
\n
XHR
\n
- \n
- 无法不发送cookie(除非使用非标准
mozAnon
标志或AnonXMLHttpRequest
构造函数) - 无法返回
FormData
实例 - 没有
fetch
的no-cors
模式相当于 - 总是遵循重定向
\n
\n
\n
\n
使用fetch而不是XHR,您可以完成一些操作:
- 您可以在请求和响应对象中使用Cache API;
- 您可以执行无模式请求(“no-cors”),从未实现CORS的服务器获取响应。您无法直接从JavaScript访问响应体,但可以与其他API(例如Cache API)一起使用;
- 流式响应(XHR将整个响应缓冲在内存中,而使用fetch您将能够访问低级流)。这在所有浏览器中都不可用,但很快就会有。
您可以使用XHR进行的某些操作,目前使用fetch无法实现,但迟早都会实现(在此处“未来的改进”段落中阅读:https://hacks.mozilla.org/2015/03/this-api-is-so-fetching/):
- 中止请求(在Firefox和Edge中现在可以使用,如@sideshowbarker在他的评论中所解释的那样);
- 报告进度。
这篇文章https://jakearchibald.com/2015/thats-so-fetch/包含更详细的描述。