了解 Fetch API与Fetch+Async/await
背景
提及前端与服务器端的异步通信,离不开 Ajax (Asynchronous JavaScript and XML)。实际上我们常说的 Ajax 并非指某一项具体的技术,它主要是基于用脚本操作 HTTP 请求的 Web 应用架构。最早出现在 Jesse James Carrett 于 2005年2月发表一篇《Ajax:A New Approach to Web Applications》中提出的一个新概念。
在 Ajax 中涉及到的 JavaScript 方面的技术,即 XMLHttpRequest(以下简称 XHR)。很长一段时间我们都是通过 XHR 来与服务器建立异步通信。然而在使用的过程中,我们发现 XHR 是基于事件的异步模型,在设计上将输入、输出和事件监听混杂在一个对象里,且必须通过实例化方式来发请求。配置和调用方式混乱,不符合关注分点离原则。
关注点分离原则所描述的是系统的元素应该表现出互不相干的目的。也就是说,没有会分担另外一个元素职责的,或者其它不相干职责的元素。
正是由于 XHR 在使用上的不便,许多前端库就将进行封装,方便开发者调用。其中影响和使用范围最广的当属 jQuery 提供的 $.ajax 方法。该方法最为先进之处在于,从 jQuery 1.5 开始,$.ajax()返回的jqXHR对象 实现了 Promise 接口, 使它拥有了 Promise 的所有属性,方法和行为。
直到 Fetch API 的提出,前端和服务器端的异步通信方面更进了一步。
技术介绍
Fetch API 是近年来被提及将要取代 XHR 的技术新标准,是一个 HTML5 的 API。
Fetch 并不是 XHR 的升级版本,而是从一个全新的角度来思考的一种设计。Fetch 是基于 Promise 语法结构,而且它的设计足够低阶,这表示它可以在实际需求中进行更多的弹性设计。对于 XHR 所提供的能力来说,Fetch 已经足够取代 XHR ,并且提供了更多拓展的可能性。
快速了解
Fetch API 规范明确了用户代理获取资源的语义。原生支持 Promise1,调用方便,符合语义化。可配合使用 ES2016 中的 async/ await 语法,更加优雅。
通过一个例子来快速了解和使用 Fetch API 最基本的用法
1 |
// 获取 some.json 资源 |
通过例子我们可以发现,使用 Fetch API 能够快速便捷地进行资源地获取。
可以简单理解为,Fetch API 是面向未来的异步通信 API。
具体用法
fetch 方法
fetch 方法有两种调用方式。
1 |
Promise fetch(String url, [, Object options]) |
- 第一个参数是一个
Request对象,第二个参数是配置信息,可选 - 第一个参数是一个
url,第二个参数是配置信息,可选
可选配置信息是一个 Object 对象,可以包含以下字段:
- method: 请求的方法,例如:
GET,POST。 - headers: 请求头部信息,可以是一个简单的对象,也可以是 Headers 类实例化的一个对象。
- body: 需要发送的信息内容,可以是
Blob,BufferSource,FormData,URLSearchParams或者USVString。注意,GET,HEAD方法不能包含body。 - mode: 请求模式,分别有
cors,no-cors,same-origin,navigate这几个可选值。- cors: 允许跨域,要求响应中
Acess-Control-Allow-Origin这样的头部表示允许跨域。 - no-cors: 只允许使用
HEAD,GET,POST方法。 - same-origin: 只允许同源请求,否则直接报错。
- navigate: 支持页面导航。
- cors: 允许跨域,要求响应中
- credentials: 表示是否发送
cookie,有三个选项- omit: 不发送
cookie。 - same-origin: 仅在同源时发送
cookie。 - include: 发送
cookie。
- omit: 不发送
- cache: 表示处理缓存的策略。
- redirect: 表示发生重定向时,有三个选项
- follow: 跟随。
- error: 发生错误。
- manual: 需要用户手动跟随。
- integrity: 包含一个用于验证资资源完整性的字符串。
Headers
Headers 可用来表示 HTTP 的头部信息,使用 Headers 的接口,你可以通过 Headers() 构造函数来创建一个你自己的 headers对象。
1 |
var headers = new Headers({
|
Headers 提供 append, delete, get, getAll, has, set, forEach等这些实例方法,可供开发者更加灵活地配置请求中的 headers。
Request
Request 类用于描述请求内容。构造函数接受的参数与fetch方法一致,这里就不展开介绍了。我们可以这么理解,事实上fetch方法在调用时,会将传入的参数构造出一个 Request 对象并执行。
1 |
var URL = '//api.some.com'; |
Request 接口中的配置项 headers 可以是实例化的 Headers 。
1 |
var URL = '//api.some.com'; |
更便捷的是,Request 对象可以从已有的 Request 对象中继承,并拓展新的配置。
1 |
var URL = '//api.some.com'; |
Response
Response 实例是在fentch()处理完promises之后返回的。它的实例也可用通过JavaScript来创建,但只有在ServiceWorkers中才真正有用。
1 |
var res = new Response(body, init); |
其中 body 可以是 Bolb, BufferSource, FormData, URLSearchParams, USVString 这些类型的值。
init 是一个对象,可以包括以下这些字段
- status: 响应状态码
- statusText: 状态信息
- headers: 头部信息,可以是对象或者
Headers实例
Response 实例提供了以下实例属性,均是只读属性。
- bodyUsed: 用于表示响应内容是否被使用过
- headers: 头部信息
- ok: 表明请求是否成功,响应状态为 200 ~ 299 时,值为 true
- status: 状态码
- statusText: 状态信息
- type: 响应类型
- basic: 同源
- cors: 跨域
- error: 出错
- opaque: Request mode 设置为 “no-cors”的响应
- url: 响应地址
Response 实例提供以下实例方法。
- clone: 复制一个响应对象。
- arrayBuffer: 将响应数据转换为 arrayBuffer 后 reslove 。
- bolb: 把响应数据转换为 Bolb 后 reslove 。
- formData: 把响应数据转换为 formData 后 reslove 。
- json: 把响应内容解析为对象后 reslove 。
- text: 把响应数据当做字符串后 reslove 。
浏览器支持

Chrome 45+, Opera 44+,Firefox 51+ 和 IE Edge 等这些版本的浏览器开始支持 Fetch API。移动端浏览器也在逐步得到支持。
我们可以通过对 window.fetch 的能力检测,判断出浏览器是否支持 Fetch API。github 官方推出了一个 Fetch API 的 polyfill 库,可以让更多浏览器提前感受到 Fetch API 的便捷的开发体验。
结语
虽然 Fecth API 使用方便符合语义化,但是现阶段它也有所限制。Fetch API 是基于 Promise,由于 Promise 没有处理 timeout 的机制,所以无法通过原生方式处理请求超时后的中断,和读取进度的能力。但是相信未来为了支持流,Fetch API 最终将会提供可以中断执行读取资源的能力,并且提供可以读取进度的 API。
参考文档
.
了解 Fetch API与Fetch+Async/await的更多相关文章
- 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用
github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...
- Ajax新玩法fetch API
目前 Web 异步应用都是基于 XMLHttpRequest/ActiveXObject (IE)实现的, 这些对象不是专门为资源获取而设计的,因而它们的 API 非常复杂,同时还需要开发者处理兼容性 ...
- ES6 Fetch API HTTP请求实用指南
本次将介绍如何使用Fetch API(ES6 +)对REST API的 HTTP请求,还有一些示例提供给大家便于大家理解. 注意:所有示例均在带有箭头功能的 ES6中给出. 当前的Web /移动应用程 ...
- Fetch API与POST请求那些事
简述 相信不少前端开发童鞋与后端联调接口时,都会碰到前端明明已经传了参数,后端童鞋却说没有收到,尤其是post请求,遇到的非常多.本文以node.js作为服务端语言,借用express框架,简要分析客 ...
- Fetch API & Async Await
Fetch API & Async Await const fetchJSON = (url = ``) => { return fetch(url, { method: "G ...
- fetch + async await 使用原生JS发送网络请求
由于现在主流浏览器支持Fetch API,无需引用其他库就能实现AJAX,一行代码就搞定,可以说是非常方便了. export default { name: 'HelloWorld', data() ...
- Fetch API 接口参考
前言 Fetch API是新的ajax解决方案,用于解决古老的XHR对象不能实现的问题,Fetch API 提供了一个获取资源的接口(包括跨域请求),任何使用过 XMLHttpRequest 的人都能 ...
- Fetch API 了解 及对比ajax、axois
Fetch是什么 Fetch 是一个现代的概念, 等同于 XMLHttpRequest.它提供了许多与XMLHttpRequest相同的功能,但被设计成更具可扩展性和高效性.Fetch被很多浏览器所支 ...
- Fetch API & cancel duplicate API & cache API
Fetch API & cancel duplicate API & cache API const usersCache = new Map<string, User>( ...
随机推荐
- Pascal 错误代码及含义
DOS 错误代码:1无效DoS功能号 2文件末找到 3路径未找到 4打开文件过多 5禁止文件存取 6无效文件句柄 12无效文件存取代码 15无效驱动器号 16不能删除当前日录 17不能跨驱动器改文件名 ...
- 手码两万余字,SpringMVC 包教包会
1. SpringMVC 简介 1.1 Spring Web MVC是什么 Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架, ...
- 【强烈推荐,超详细,实操零失误】node.js安装 + npm安装教程 + Vue开发环境搭建
node.js安装 + npm安装教程 + Vue开发环境搭建 [强烈推荐,超详细,实操零失误] 原博客园地址:https://www.cnblogs.com/goldlong/p/8027997.h ...
- .NET平台性能测试工具BenchmarkDotnet 简介[译文]
项目中需要用到性能测试,发现.net 平台的这个神器. 觉得很不错,接下来准备做个系列.具体参考官方介绍 做基线对比测试不是那么容易,你很容易就翻车掉坑里,BenchmarkDotNet 会帮你避坑( ...
- 8.5-Day1T2--Asm.Def 的基本算法
题目大意 给一棵树,求∑∑w_i*w_j*w_LCA(i,j) w_i表示i点权值 题解 显然一点点求lca是肯定会tle的 那就想如何优化 i和j的lca和j和i的lca是一样的 DFS,在每个x处 ...
- memcache安装 基于Red Hat 7.4
Linux版本为 Red Hat 7.4 一.安装 1.下载:http://memcached.org/downloads 解压: tar -xzvf memcached-1.5.3.tar.gz 得 ...
- Tomcat,Jboss,Weblogic通过jndi连接数据库
1. Tomcat配置Jndi数据源 1.1在tomcat服务器的lib目录下加入数据库连接的驱动jar包 1.2修改tomcat服务器的conf目录下server.xml配置文件 编辑server ...
- 吴裕雄 python 神经网络TensorFlow实现LeNet模型处理手写数字识别MNIST数据集
import tensorflow as tf tf.reset_default_graph() # 配置神经网络的参数 INPUT_NODE = 784 OUTPUT_NODE = 10 IMAGE ...
- Java面向对象内存图
1. java虚拟机的内存划分 2. 苹果手机类 package cn.itcast.day06.demo02; /* 定义一个类,用来模拟“手机”事物. 属性:品牌.价格.颜色 行为:打电话.发短信 ...
- Ansible自动化搭建及工具集和常见模块、命令详情(重点)
一.ansible介绍 1.ansible简介 官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具. Ansible跟其他IT自动化技术的区别 ...