对于fetch的理解
在一篇文章里见到一位作者是这么说的
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 来实现。
文章引用:
对于fetch的理解的更多相关文章
- git命令详解( 二 )
这是git详解的第二篇,最近这个加班有点虚,所以文章也写的比较懒了,一到加班不得已,保温杯里泡枸杞啊,不扯了,今天我们来看看git的第二篇 这篇内容主要是git的一些远程命令 远程仓库 git clo ...
- Git 沙盒模拟实战(远程篇)
Git 沙盒模拟实战(远程篇) >---基础篇 远程仓库 远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝 ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD【转】
转自:http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必 ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD
真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须要附加讲清楚git remote,git merge .远程repo, branch . commi ...
- 结合promise对原生fetch的两个then用法理解
前言:该问题是由于看到fetch的then方法的使用,产生的疑问,在深入了解并记录对promise的个人理解 首先看一下fetch请求使用案例: 案例效果:点击页面按钮,请求当前目录下的arr.txt ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD(转)
转自http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须 ...
- 理解 ajax、fetch和axios
背景 ajax fetch.axios 优缺点 ajax基于jquery,引入时需要引入庞大的jquery库,不符合当下前端框架,于是fetch替代了ajax 由于fetch是比较底层,需要我们再次封 ...
- Git 少用 Pull 多用 Fetch 和 Merge
本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让它更短些.在Git的邮件列表里有很多关于本文的讨论,我会尽量把其中相关的观点列在下面. 我最常 ...
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
随机推荐
- html2canvas 返回的toDataURL()数据为 data:,的解决方法
1.使用的场景是把html转换成PDF保存下来,代码: /* eslint-disable */ import html2canvas from 'html2canvas'; import JsPDF ...
- Java面向对象笔记 • 【第10章 Swing编程初级应用】
全部章节 >>>> 本章目录 10.1 JFrame窗口容器 10.1.1 Swing介绍 10.1.2 JFrame窗口容器应用 JFrame常用方法 10.1.3 实践 ...
- Kerberos打开debug日志
在JVM的启动参数中加入如下配置,打开kerberos的debug开关: -Dsun.security.krb5.debug=true JVM启动后,kerberos的相关日志会打印到控制台中, 因为 ...
- Notepad++插件Base64编解码
我们平常进行Base64编码需要自己写代码转换, 或者使用其他人编写的小工具程序, 也可以使用在线base64编码工具, 现在我们还可以使用Notepad++自带的插件, 进行Base64编码和解码, ...
- 【】URL中的文本IPv6地址的格式RFC2732
RFC2732规范中URL中的文本IPv6地址的格式, 截取其中重要部分原文如下: RFC 2732 Format for Literal IPv6 Addresses in URL's Decemb ...
- Postman保存token并使用token的整个流程
1. 调通获取token的接口,包含传递参数的类型,和输入密码是否需要md5加密,根据接口的要求,传入数据 2. 查看接口响应的报文,可以看到token的有效时间,token的类型,里面的access ...
- Shell 里空语句怎么写 - 半角的冒号
Python 里的空语句写作pass for x in range(10): pass Shell 里的空语句写作 : #!/bin/bash for x in {1..10} do #echo $x ...
- git报错 error: cannot stat 'file': Permission denied
切换分支(git checkout xxx)时报错: error: cannot stat 'file': Permission denied 解决方法:退出编辑器.浏览器.资源管理器等,然后再切换就 ...
- Python2 和 Python3 共存于 Centos7
一.解决Python2 pip问题 centos7自带的是Python2,但是并没有安装pip,我们需要自行安装 包名为 python-pip # yum install epel-release - ...
- python驱动SAP完成数据导出(二)
在上一篇 python驱动SAP完成数据导出(一)中,我们提到了数据导出前,SAP布局的重要性,如何识别当前布局模式,以及如何切换到想要的布局.本篇小爬将着重讲讲数据导出的注意事项. 我们可以通过如下 ...