promise 规范

Promise 的术语

  1. promise 是一个有 then 方法的对象或者是函数,行为遵循本规范
  2. thenable 是一个有 then 方法的对象或者是函数
  3. valuepromise 状态成功时的值,也就是 resolve 的参数, 表示结果的数据
  4. reasonpromise 状态失败时的值, 也就是 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
     }
     ```