在一篇文章里见到一位作者是这么说的

XMLHttpRequest 是一个设计粗糙的 API,不符合关注分离(Separation of Concerns)的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise,generator/yield,async/await 友好。

Fetch的出现就是为了解决XHR的问题

首先我们分析XHR发送一个请求的方式

var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'json'; xhr.onload = function() {
console.log(xhr.response);
}; xhr.onerror = function() {
console.log("Oops, error");
}; xhr.send();

然而使用了Fetch后

fetch(url).then(function(response) {
return response.json();
}).then(function(data) {
console.log(data);
}).catch(function(e) {
console.log("Oops, error");
});

再将其变成es6的箭头函数

fetch(url).then(response => response.json())
.then(data => console.log(data))
.catch(e => console.log("Oops, error", e))

这样看起来就少了很多,可看性很好,但是作者不是很满意,说这种promise的写法有callback的影子,并且prominse使用catch来精选错误处理的方式有点奇怪,于是乎他就用上了async/await

这里需要说明一下async/await是ES7的新API,可以用bable编译成ES5代码,使用await外面不包async会报错

let url="xxxxxxx";
async function main(){
try {
let response = await fetch(url);
let data = response.json();
console.log(data);
} catch(e) {
console.log("Oops, error", e);
}
}

对于fetch跨域需要设置mode

mode有三个取值

  • same-origin 不允许跨域
  • cors 允许跨域,需服务器配合如 node.js
  • no-cors 允许跨域,服务器不需要设置如上代码但不能将服务端数据返回

当然fetch和xhr也是有区别的

fetch是有兼容性问题的,对ie不是很友好

fetch不管请求成功还是失败,都会触发promise的resolve状态回调,fetch只有在网络故障导致的发送请求失败或者跨域才会触发reject的逻辑,我们可以通过response 对象的ok是否是true来判断是否是真正的成功。

fetch配置请求是否携带cookie和接受服务端写入cookie是通过设置credentials  // include, same-origin, *omit

fetch不想xhr可以原生支持异步请求,fetch因为默认是一个promise的对象。所以如果想用同步的写法,可以借助async await 来实现。

文章引用:

传统ajax已死,fetch永生

最新文章

  1. sap去除后缀0方法
  2. Python基本语法,python入门到精通[二]
  3. JVM内存结构、垃圾回收那点事
  4. POJ3613 Cow Relays(矩阵快速幂)
  5. jquery 插件之 点赞“+1” 特效
  6. 输入的全角字符转换成半角字符--css、js、ASP.NET
  7. Codeforces Round #138 (Div. 2)
  8. java多线程之 Executors线程池管理
  9. PHP将解析xml变为数组方法
  10. Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils)
  11. 在windows下安装pip scrapy...
  12. MySQL Tips
  13. 【问题解决方案】从 Anaconda Prompt 或 Jupyter Notebook 终端进入Python后重新退出到命令状态
  14. [Java初探外篇]__关于正则表达式
  15. ping主机不通邮件报警
  16. 1.maven中pom.xml文件中<exclusions>标签认不到问题
  17. 在Windows7系统上能正常使用的程序,Windows10运行后部分状态不能及时变更
  18. JSTL标签库学习记录2-fmt
  19. Regex Golf练习笔记(1)
  20. linux用户权限 -> 系统基本权限

热门文章

  1. kotlin+springboot+mybatis-puls+mysql搭建gradle-web工程
  2. [opencv]keypoint数据结构分析
  3. 部署Kubernetes Cluster
  4. kubernetes运行应用1之Deployment
  5. AWS 15年(2):云原生兴起
  6. 论文翻译:2020_Acoustic Echo Cancellation Based on Recurrent Neural Network
  7. 使用.NET 6开发TodoList应用(22)——实现缓存
  8. python极简教程04:进程和线程
  9. idea 个人settings和好看的主题推荐
  10. Sentry 开发者贡献指南 - 配置 PyCharm