Promies:ES6新增的内置类(构造函数),用来规划异步编程代码,解决回调地狱等问题。
l let p1 = new Promise([executor])
+ [executor]必须是一个函数,而且new Promise的时候会立即把其执行 「同步」
+ p1是其创建出来的实例私有属性
+ [[PromiseState]]:"pending"、"resolved/fullfilled"、"rejected"实例的状态
+ [[PromiseResult]]:undefined 实例的值「成功的结果或失败的原因」
公共方法:Promise.prototype
+ then
+ catch
+ finally
+ ...
+ p1.then([onfulfilled],[onrejected])
+ [onfulfilled]/[onrejected]]都是函数
+ 实例状态是成功fulfilled的时候,会把[onfulfilled]执行,并且把实例的值作为成功的结果传递给他
let p1 = new Promise((resolve, reject) => {
resolve(10);
});
let p2 = p1.then(value => {
console.log('成功', value); //成功 10
}, reason => {
console.log('失败', reason);
});
p2.then(value => {
console.log('成功', value); //成功 undefined
}, reason => {
console.log('失败', reason);
});
如何修改实例的状态和值
@1 基于这种方式创建实例
let p =new Promise((resolve,reject)=>{
...
});
+ 如果executor函数执行报错,则把实例的状态修改为rejected,值是报错原因「不会抛出异常」
+resolve/reject也是函数,resolve('OK')-> 把实例p的状态修改为fulfilled,值(成功结果)是'OK';reject('NO')-> 把实例p的状态修改为rejected,值(失败原因)是'NO'
+ 一旦状态被修改为fulfilled或rejected,后期就不会再更改状态值了
@2 每一次执行THEN方法,都会返回一个“全新的promies实例”
let p2 = p1.then(onfulfilled,onrejected);
+ 不论是onfulfilled还是onrejected执行(由p1状态来决定),方法的执行决定了p2的状态和值
+首先看方法执行是否报错,如果报错了,则p2是失败态(rejected),值是报错原因
+如果执行不报错,再看方法的返回值
+ 如果返回的是“新的promise实例->@NP”,则@NP的状态和值直接决定了p2的状态和值
+ 如果返回的不是新实例,则p2状态是成功(fulfilled),值是函数的返回值
@3 执行Promise.resolve/reject/all/any/race...等静态私有方法,也会创建新的promise实例
+ Promise.resolve(10)创建一个状态是成功fulfilled,值是10的实例
+ Promise.reject(0)创建一个状态是失败rejected,值是0的实例
THEN链的穿透/顺延机制
.then(onfulfilled,onrejected),两个方法可以传可以不传,如果不传,则顺延至下一个THEN中,相同状态要执行的方法中去处理!!
+ 原理:我们不设置对应的方法,Promise内部会默认加一个对应的方法,可以让其实现状态的顺延/穿透
--------------
p.catch(onrejected) 等价于 p.then(null,onrejected)
关于Promise.all/any/race三个方法的研究
let p = Promise.all/any/race([promises]);
+ promises是包含零到多个promise实例的集合,一般是数组!如果集合中的某一项不是promise实例,则默认变为状态为成功,值是本身的promise实例!!
+ all:集合中的“每个实例都成功”,最后结果p才成功,值时按照集合顺序,依次存储每个实例成功结果的数组;其中只要有一个实例失败,则p就是失败的,值是本次失败的原因,后面的操作不在处理!!
+ any:只要有一个成功,最后p就是成功的,值是本次成功的结果;都失败,最后p才是失败!「兼容性不好」
+ race:集合中谁最先知道结果,则以谁的为主!