promise 规范

Promise 的术语

  1. promise 是一个有 then 方法的对象或者是函数,行为遵循本规范
  2. thenable 是一个有 then 方法的对象或者是函数
  3. value 是 promise 状态成功时的值,也就是 resolve 的参数, 表示结果的数据
  4. reason 是 promise 状态失败时的值, 也就是 reject 的参数, 表示拒绝的原因
  5. exception 是一个使用 throw 抛出的异常值

Promise States

三种状态

  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 值

  3. rejected
    3.1 最终态,不可改变
    3.2 一个 promise 被 reject 后变成这个状态
    3.3 必须有一个 reason 值

then

promise 应该提供一个then犯法,用来访问最终的结果

promise.then(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 特性
    2.1 在 promise 变成 rejected 时,应该调用 onRejected, 参数是 reason
    2.2 在 promise 变成 rejected 之前,不应该被调用
    2.3 只能被调用一次(可能需要一个变量来限制执行次数)

  4. onRehected 和 onFulfilled 应该是微任务

    queueMicrotask 来实现微任务

    queueMicrotask(() => {
        
    })
    
  5. then 方法可以被调用多次

    const promise = new Promise()
    promise.then(cb1.cb2)
    promise.then(cb1.cb2)
    promise.then(cb1.cb2)
    promise.then(cb1.cb2)
    

    5.1 promise 变成 fulfilled 后, 所有 onfulfilled 回调都需要按照 then 的 顺序执行(用数组来存放 onFuifilled list)
    5.2 promise 变成 rejected 后,所有的 onRejected 回调都需要按照 then 的顺序执行(用数组来存放 onRejected list)

  6. then 的返回值
    应该返回一个 promise

    promise2 = promise1.then(xx,xx)
    

    6.1 onFulfilled 或者 onRejected 执行结果为x, 调用 resolvePromise 方法
    6.2 如果 onFulfilled 或者 onRejected 执行时抛出异常e,promise2需要被 rejected
    6.3 如果 onFulfilled 不是一个函数,promise2 以 promise1 的 value 触发 fulfilled
    6.4 如果 onRejected 不是一个函数,promise2 以 promise1 的 reason 触发 rejected

  7. resolvePromise

    resolvePromise(promise2,x,resolve,reject)
    

    7.1 如果 promise2 和 x 全相等, 那么 reject typeError。
    7.2 如果 x 是一个 promise
    如果 x 是 pending, promise2 一定继续pending ,知道 x 变成了 fulfilled 或者 rejected
    如果 x 是 fulfilled , resolve 返回 value
    如果 x 是 rejected , reject 返回 reason
    7.3 如果 x 是一个object 或者 function

     ```js
     try {
         let then = x.then
         // then 是函数
         then.call(x,resolvePromiseFn, rejectePromiseFn)
         // then 不是函数 resolvePromiseFn 返回 x
     } catch(e) {
         reject promise e
     }
     ```