Promise

133 阅读3分钟

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:集合中谁最先知道结果,则以谁的为主!