PWA 学习笔记(三)
基础技术简介
Promise:
1、ES6 引入的一种异步编程的解决方案,通过 Promise 对象来提供统一的异步状态管理方法
2、一般在使用 Promise 对象的时候,首先需要对其进行实例化
3、实例化的 Promise 对象为异步状态的管理容器,resolve()和reject()是用于控制 promise 状态的方法
4、在调用 resolve()和reject()方法的时候可传入任意值,这个值会作为监听状态变更的回调函数的参数透传出去
5、Promise 提供了 .then(onFulfilled, onRejected) 和 .catch(onRejected)等
原型链方法用于注册状态变更所触发的回调函数
let promise = new Promise((resolve, reject) => {
if (/* 操作成功 */) {
resolve(value)
} else {
reject(error)
}
})
Promise 状态:
1、'pending':初始状态,代表异步过程仍在进行中,尚未判定成功或者失败
2、'fulfilled':操作成功,通过调用 resolve() 方法,promise 状态将由 'pending' 变更为 'fulfilled'
3、'rejected':操作失败,通过调用 reject() 方法,promise 状态将变更为 'rejected'
Promise 的可靠性:
1、统一格式:经过 Promise 包装的异步过程将具有统一的状态变更方式,统一的 API 以及统一的回调函数格式
2、状态不受外部影响:只能通过 resolve() 和 reject()方法控制 Promise 的状态,这个状态无法被外部直接访问,
也没有提供任何方法从外部修改状态
3、状态具有确定性:从初始状态(pending)变更为执行成功(fulfilled)或者执行失败(rejected),
那么这个状态就被完全确定下来了,不会被后续的任何操作所影响
4、回调函数是一次性的:至多触发一次,规避了过去基于回调函数的异步编程当中回调函数执行次数不受控制的问题
5、不存在回调过早问题:如果回调函数在状态变更前注册,则会等待状态变更时触发;当注册时状态已经确定下来,
那么 Promise 会立即调用这个函数并传入相应的返回值
6、回调函数间不相互影响:同一个 Promise 上注册的回调函数彼此相互隔离,
因此个别回调函数执行出错并不会影响到其他回调函数的正常执行
7、回调函数执行的时序是确定的
Promise 的串行执行与链式调用:
1、Promise.prototype.then:
(1).then(onFulfilled, onRejected) 是 Promise 的原型链方法,用于注册 Promise 对象状态变更时的回调函数
(2)它接受两个回调函数作为参数,分别在 Promise 变更为不同状态时触发,其中 onRejected 可以缺省
(3).then() 方法会创建并返回一个新的 Promise 对象(用 p2 指代,当前监听的 Promise 对象用 p1 指代),
用于表征回调函数的执行情况,这个过程满足如下规则:
a、p1 的状态只决定了何时执行回调以及执行那种类型的回调,并不会影响到 p2 状态
b、p2 的初始状态为 'pending',当回调函数执行成功时状态变更为 'fulfilled',
如果回调执行过程抛出异常则变更为 'rejected'
c、回调函数的返回值 value 将作为 p2 触发状态变更时 resolve(value) 的参数将其传递下去
2、Promise 的链式调用:
(1)可非常直观地将多个需要按顺序执行的异步过程以一种自上而下的线性组合方式实现,
在降低编码难度的同时,也增加了代码的可读性
(2)基于注册在同一 Promise 对象的回调函数彼此互不干扰的特性,我们可以在任何需要的地方进行链分叉
3、Promise 并行执行与管理:
(1)基于 Promise 的异步任务串行执行,本质上是通过 .then()方法去控制上一个异步任务
完成之后再触发下一个异步任务的执行
(2)只需要同步地创建这些异步任务,并对它们的 Promise 对象进行相应的管理即可改造成并行执行
function getX() {
return new Promise(resolve => {
setTimeout(() => {
resolve(1)
}, 3000)
})
} function getY() {
return new Promise(resolve => {
setTimeout(() => {
resolve(10)
}, 5000)
})
} function getXAndY([promiseX, promiseY]) {
let results = []
return promiseX
.then(x => {
results.push(x)
return promiseY
})
.then(y => {
results.push(y)
return results
})
} getXAndY([
getX(),
getY()
])
.then(results => {
// 5s 后输出 11
console.log(results[0] + results[1])
})
(3)Promise 已经提供了 Promise.all() 方法来实现与上述 getXAndY 一样的功能(一种并行状态管理的方案)
(4)Promise.race() 方法,用于获取第一个发生状态变更的 Promise 对象
Fetch API:
1、Fetch API 首先提供了网络请求相关的方法 fetch(),其次还提供了用于描述资源请求的 Request 类,以及描述
资源响应的 Response 对象,这样就能够以一种统一的形式将资源的请求与响应过程应用到更多的场景当中
2、fetch() 需要传入一个 Request 对象作为参数,它会根据 Request 对象所描述的请求信息发起网络请求
3、fetch() 还支持传入请求 URL 和请求配置项的方式,它会自动根据这些参数实例化 Request 对象之后再去发起请求
fetch(new Request('/path/to/resource', {method: 'GET'}))
// 等价于
fetch('/path/to/resource', {method: 'GET'})
4、fetch() 会返回 Promise 对象,当请求响应时 Promise 执行 resolve 并传回 Response 对象
5、fetch() 只有在网络错误或者是请求中断的时候才会抛出异常,此时 Promise 对象会执行 reject 并返回错误信息,
而服务端返回的 HTTP 404、500 等状态码并不认为是网络错误,需要检查 Response.status、Response.ok
等属性以确保请求成功响应
fetch('/path/to/resource').then(response => {
if (response.status === 200) {
// 请求成功
} else {
// 请求失败
}
})
.catch(err => {
// 网络请求失败或请求被中断
})
Request:
1、Request 是一个用于描述资源请求的类,通过 Request() 构造函数可以实例化一个 Request 对象
2、语法格式:let request = new Request(input, init)
注:input 代表想要请求的资源,可以是资源的 URL,或者是描述资源请求的 Reqeust 对象;
init 为可选参数,可以用来定义请求中的其他选项
3、发送请求:
(1)GET 请求,请求参数需要写到 URL 当中
(2)POST 请求,请求参数需要写到 body 当中
(3)自定义请求的 Headers 信息
(4)设置发起资源请求时带上 cookie
// GET 请求
let getRequest = new Request('requestUrl?name=lilei', {
method: 'GET'
}) // POST 请求
let postRequest = new Request('requestUrl', {
method: 'POST',
// body 可以是 Blob、FormData、字符串等等
body: JSON.stringify({
name: 'lilei'
})
}) // 自定义请求的 Headers 信息
let customRequest = new Request('requestUrl', {
// 这里展示请求 Content-Type 为 text/plain 的资源
headers: new Headers({
'Content-Type': 'text/plain'
})
})
4、常见属性:
(1)url:String 类型,只读,请求的 url
(2)method:String 类型,只读,请求的方法,如 'GET','POST' 等
(3)headers:Headers 类型,只读,请求的头部,可通过 get() 方法获取 'Content-Type','User-Agent' 等信息
//设置发起资源请求时带上 cookie
let cookieRequest = new Request('requestUrl', {
credentials: 'include'
}) if (request.url === 'https://example.com/data.txt') {
// ...
}
if (request.method === 'POST') {
// ...
}
if (reuqest.headers.get('Content-Type') === 'text/html') {
// ...
}
Response:
1、Response 类用于描述请求响应数据,通过 Response() 构造函数可以实例化一个 Response 对象
2、语法格式:let response = new Response(body, init)
注:body 参数代表请求响应的资源内容,可以是字符串、FormData、Blob 等等;
init 为可选参数对象,可用来设置响应的 status、statusText、headers 等内容
3、在实际应用当中,我们一般会通过 fetch()、Cache API 等等获得请求响应对象,然后再对响应对象进行操作
4、Response 对象的相关属性:
(1)status:Number 类型,包含了 Response 的状态码信息,开发者可以直接通过 status 属性进行状态码检查,
从而排除服务端返回的错误响应
(2)statusText:String 类型,包含了与状态码一致的状态信息,一般用于解释状态码的具体含义
(3)ok:Boolean 类型,只有当状态码在 200-299 的范围时,ok 的值为 true
5、读取响应体:
(1)text():解析为字符串
(2)json():解析为 JSON 对象
(3)blob():解析为 Blob 对象
(4)formData():解析为 FormData 对象
(5)arrayBuffer():解析为 ArrayBuffer 对象
6、Response 提供了 clone() 方法来实现对 Response 对象的拷贝
Fetch API 与 XHR 对比:
1、Fetch API 的异步机制更为先进
2、Fetch API 更为简洁
3、Fetch API 的应用范围更广
Cache API:
1、兼容性检测:在主线程或者 Worker 线程中通过判断全局变量 caches 是否存在来检测浏览器是否支持 Cache API
if ('caches' in self) {
console.log('当前环境支持 Cache API')
}
2、打开 Cache 对象:通过 caches.open() 方法可以打开一个 Cache 对象,cacheName 表示要打开的 Cache 对象的名称。
该方法是异步方法,返回的 Promise 对象在 resolve 时会返回成功打开的 Cache 对象
caches.open(cacheName).then(cache => {/* 获得 Cache 对象 */})
3、添加缓存:Cache 对象提供了 put()、add()、addAll() 三个方法来添加或者覆盖资源请求响应的缓存
这些添加缓存的方法只会对 GET 请求起作用
4、查找缓存:cache.match() 和 cache.matchAll() 可以实现对缓存的查找
5、获取匹配的请求:通过 cache.keys() 方法实现
6、删除缓存:通过 cache.delete() 方法可以实现对缓存的清理
PWA 学习笔记(三)的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- go proxy athens 部署到k8s
目录 go proxy athens 部署到k8s 一.athens简介 二.部署 1.创建 PersistentVolume 2.创建service 3.创建deployment 4.ci/cd中使 ...
- Java修炼——四种方式解析XML_SAX
四种方式解析XML:DOM JDOM DOM4J SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...
- 设计模式GOF23(行为型模式)
场景: – 公司里面,报销个单据需要经过流程: • 申请人填单申请,申请给经理 • 小于1000,经理审查. • 超过1000,交给总经理审批. • 总经理审批通过 – 公司里面,请假条的审批过程: ...
- [TimLinux] MySQL 导入sql文件数据慢的问题解决办法
慢的时候执行的命令: mysql -uusername -p -hip_address -Ddb_name < ./db.sql 快的时候执行的命令: mysql -uusername -p - ...
- 【JS】324- JS中的内存管理(中高级前端必备)
前言 像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()用于分配内存和释放内存.而对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再 ...
- 【算法】272-每周一练 之 数据结构与算法(Dictionary 和 HashTable)
这是第五周的练习题,上周忘记发啦,这周是复习 Dictionary 和 HashTable. 下面是之前分享的链接: [算法]200-每周一练 之 数据结构与算法(Stack) [算法]213-每周一 ...
- Flume理论研究与实验
一.理论研究 1.1 总览 Flume是一个分布式的可靠的日志收集系统,主要是用于从各种数据源收集.聚合并移动大批量的日志数据到存储系统:它本身具有许多故障转移和恢复机制,具有强大的容错能力:它使用下 ...
- node+express 配置安装以及数据解析,cookie,session
一.express安装,创建服务 (1)安装:npm install express --save(2)创建服务 server.js: const express = require('express ...
- HPS端如何通过AXI Bridge控制FPGA端口的GPIO
该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge AXIB主要包括H2FB.F2HB.LWH2F ...
- cannot resolve symbol AppCompatActivity
记一次配置性的问题 今天复习自定义控件的时候新建一个project,生成的代码冒红,可把我给郁闷了.我知道我的配置是正确的,可是... 它出现了cannot resolve symbol AppCom ...