我知道Fetch API使用Promise
,两者都允许您向服务器发起AJAX请求。
我了解到Fetch API有一些额外的功能,在XMLHttpRequest
(以及基于XHR
的Fetch API填充程序)中不可用。
Fetch API有哪些额外的能力?
我知道Fetch API使用Promise
,两者都允许您向服务器发起AJAX请求。
我了解到Fetch API有一些额外的功能,在XMLHttpRequest
(以及基于XHR
的Fetch API填充程序)中不可用。
Fetch API有哪些额外的能力?
使用fetch可以做的一些事情,而XHR无法做到:
no-cors
请求,从未实现CORS的服务器获取响应。您无法直接从JavaScript访问响应主体,但是您可以将其与其他API(例如缓存API)一起使用;使用XHR可以做到的一些事情,目前使用fetch还不能做到,但迟早会提供(请阅读此处的“Future improvements”段落:https://hacks.mozilla.org/2015/03/this-api-is-so-fetching/):
本文https://jakearchibald.com/2015/thats-so-fetch/包含了更详细的描述。
fetch
可以请求文件,但XHR不能。 - D. Pardal--allow-file-access-from-files
(chromium)mozAnon
标志或AnonXMLHttpRequest
构造函数,否则无法不发送cookie。FormData
实例。fetch
的no-cors
模式相当的东西。fetch
也缺少进度追踪功能。使用XHR时,您可以通过progress
事件跟踪进度。 - rzrResponse#body
。 - Knuno-cors
看起来并不是那么有用。 - JamesTheAwesomeDude上面的答案很好,提供了很好的见解,但我与这篇谷歌开发者博客文章中分享的观点相同,在实际应用中主要区别在于fetch
返回的内置promise的方便性。
而不是编写下面这样的代码:
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();
我们可以使用 Promise 和现代语法来清理代码并编写更简洁易读的内容
fetch('./api/some.json')
.then((response) => {
response.json().then((data) => {
...
});
})
.catch((err) => { ... });
fetch(url).then(function(data) (...));
不比使用XMLHttpRequest
更简单呢?它可能有很多其他功能,但是对于常见的用途来说,使用它确实更简单。这确实是一个简化过的API。 - jfriend00