我知道Fetch API使用promise,它们都允许你对服务器进行AJAX请求。
我读过Fetch API有一些额外的功能,这在XMLHttpRequest中是不可用的(在Fetch API polyfill中,因为它是基于XHR的)。
Fetch API有什么额外的功能?
我知道Fetch API使用promise,它们都允许你对服务器进行AJAX请求。
我读过Fetch API有一些额外的功能,这在XMLHttpRequest中是不可用的(在Fetch API polyfill中,因为它是基于XHR的)。
Fetch API有什么额外的功能?
当前回答
获取
缺少使用文档的内置方法 还没办法设置超时 不能重写内容类型响应标头 如果存在内容长度响应报头,但未公开,则在流处理期间正文的总长度是未知的 即使请求已经完成,也会调用信号的中止处理程序吗 没有上传进度(ReadableStream实例作为请求体的支持尚未到来) 不支持——allow-file-access-from-files
XHR
没有办法不发送cookie(除了使用非标准mozAnon标志或AnonXMLHttpRequest构造函数) 不能返回FormData实例 没有与fetch的no-cors模式等价的东西 始终遵循重定向
其他回答
上面的答案很好,提供了很好的见解,但我同意谷歌开发人员博客中分享的观点,主要的区别(从实用的角度来看)是从fetch返回的内置承诺的便利性
而不是像这样写代码
function reqListener() {
var data = JSON.parse(this.responseText);
}
function reqError(err) { ... }
var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();
我们可以用承诺和现代语法把事情整理干净,写一些更简洁易读的东西
fetch('./api/some.json')
.then((response) => {
response.json().then((data) => {
...
});
})
.catch((err) => { ... });
获取
缺少使用文档的内置方法 还没办法设置超时 不能重写内容类型响应标头 如果存在内容长度响应报头,但未公开,则在流处理期间正文的总长度是未知的 即使请求已经完成,也会调用信号的中止处理程序吗 没有上传进度(ReadableStream实例作为请求体的支持尚未到来) 不支持——allow-file-access-from-files
XHR
没有办法不发送cookie(除了使用非标准mozAnon标志或AnonXMLHttpRequest构造函数) 不能返回FormData实例 没有与fetch的no-cors模式等价的东西 始终遵循重定向
你可以用fetch而不是XHR做一些事情:
你可以在请求和响应对象中使用缓存API; 您可以执行无CORS请求,从未实现CORS的服务器获得响应。你不能直接从JavaScript访问响应体,但你可以使用它与其他API(例如缓存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/包含更详细的描述。