PromiseA+ 标准

术语

  1. promise是一个有then办法的对象或者函数,行为遵循PromiseA+标准
  2. thenable是一个有then办法的对象或者函数
  3. value是Promise状态胜利时的值,也是resolve的参数,包含各种数据类型, undefined / string / number / boolean / promise ...
  4. reason是Promise状态失败时的值,也就是reject的参数,示意回绝的起因
  5. exception throw 抛出去的异样

标准

Promise States

promise有三种状态,要留神他们之间的关系

  1. pending
    1.1 初始状态,能够扭转
    1.2 一个promise在被resolve或者reject之前,都处于这个状态
    1.3 通过 resolve -> fulfilled
    1.4 通过 reject -> rejected
  2. fulfilled
    2.1 最终态,不能够扭转
    2.2 一个promise在被resolve之后变成这个状态
    2.3 必须有一个value值 // undefined
  3. rejected
    3.1 最终态,不能够扭转
    3.2 一个promise在被reject之后变成这个状态
    2.3 必须有一个reason值 // undefined

pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected

then

promise应该提出一个then办法,用来拜访最终的后果,无论是value还是reason。

    promsie.resolve(onfulfilled, onrejected);
  1. 参数要求
    1.1 onfulfilled 必须是函数类型,如果不是函数,应该被疏忽
    1.2 onrejected 必须是函数类型,如果不是函数,应该被疏忽
  2. onfulfilled个性
    2.1 在 promise 变成 fulfilled 后,应该调用 onfulfilled,参数是value
    2.2 在 promise 变成 fulfilled 前,不应该被调用
    2.3 只能被执行一次
  3. onrejected个性
    3.1 在 promise 变成 rejected 后,应该调用 onrejected,参数是reason
    3.2 在 promise 变成 rejected 前,不应该被调用
    3.3 只能被执行一次
  4. onfulfilled 和 onrejected 应该是微工作
    queueMicrotask 实现微工作的调用
  5. then办法能够被调用屡次
    5.1 promise 变成 fulfilled 后,所有 onfulfilled 回调都应该依照then的程序执行

     在实现promsie的时候,咱们须要一个数组来存储 onfulfilled的cb
        promise.then(cb1).then(cb2).then(cb3)...    // or    const promise = new Promsie();    promise.then(cb1);    promise.then(cb2);    // 

    5.2 promise 变成 rejected 后,所有 onrejected 回调都应该依照then的程序执行

     在实现promsie的时候,咱们须要一个数组来存储 onrejected的cb
  6. 返回值
    then的返回值是一个promise,新的? 旧的?

        promsie2 = promise1.then(onfulfilled, onrejected)

    6.1 onfulfilled 和 onrejected 执行的后果为 x,调用 resolvePromise
    6.2 onfulfilled 和 onrejected 执行的异样,promsie2须要被rejected
    6.3 如果onfulfilled不是一个函数,promsie2 以 promise1的value 触发 fulfilled
    6.4 如果onrejected不是一个函数,promsie2 以 promise1的reason 触发 rejected

  7. resolvePromise

        resolvePromsie(promise2, x, resolve, reject);

    7.1 如果promise2 和 x 相等,那么reject typeError 会死造成死循环,为什么 ???
    7.2 如果x 是 promise

     如果x 是 pending,promise的状态必须也是期待/pending,晓得x 变成了 fulfilled / rejected 如果x 是 fulfilled,fulfilled promise width the same value  值的透传 如果x 是 rejected,reject promise width the same reason 

    7.3 如果x 是一个object 或者是一个 function

     let then = x.then; 如果x.then 这一步出错了, try catch(e), reject(e)     **如果是一个object 怎么可能会出错 ???** 如果then是一个函数, then.call(x, resolvePromsieFn, rejectedPromiseFn); resolvePromsieFn 入参 y,执行resolvePromsie(promise2, y, resolve, reject); 如果调用then的时候抛出了异样e,reject reason