我知道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/包含更详细的描述。