PromiseA+规范

promiseA+ 规范

常见术语

  1. promise,一种约定,是一个有then方法的对象或者函数,行为遵循本规范
  2. thenable,一个有then方法的对象或者函数
  3. value,promise成功后的值,resolve的参数,类型:number、boolean、undefined、promise
  4. reason,promise失败后的值。reject的参数,表示拒绝的原因
  5. exception,异常值

规范

Promise States

有三种状态,pending、fulfilled、rejected

  1. pending

    1.1 初始状态,可改变
    1.2 一个Promise在 resolve/reject 之前都处于这个状态
    1.3 resolve: pending => fulfilled 状态
    1.4 reject: pending => rejected 状态

  2. fulfilled

    2.1 最终状态,不可改变
    2.2 一个Promise在被resolve之后会变成这个状态
    2.3 必须拥有一个value值

  3. rejected

    3.1 最终状态,不可改变
    3.2 一个Promise在被reject之后会变成这个状态
    3.3 必须拥有一个reason值

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

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 特性

    3.1 在 promise 变成 rejected 时,应该调用 onRejected,参数是 reason
    3.2 在 promise 变成 rejected 之前,不应该被调用
    3.3 只能被调用一次

  4. onFulfilled 和 onRejected 执行环境应该在微任务里

    微任务:一个高优先级的东西,浏览器提供的微任务方法:queueMicrotask(() => {})
    宏任务:setTimeout(() => {})

  5. then 方法可以被调用多次

    5.1 promise 状态变成 fulfilled 后,所有的 onFulfilled 回调需要按照 then 的顺序执行
    5.2 promise 状态变成 rejected 后,所有的 onRejected 回调需要按照 then 的顺序执行

const promise = new Promise()

promise.then(cb1, cb2)
promise.then(cb1, cb2)
promise.then(cb1, cb2)
promise.then(cb1, cb2)
  1. 返回值

    then 返回应该是一个新的promise

    const promise1 = new Promise()
    
    const promise2 = promise.then(cb1, cb2)
    
    promise2.then(cb1, cb2)
    

    6.1 promise1 的 onFulfilled 或者 onRejected 执行结果为 x ,调用一个 resolvePromise()(用于解析 Promise,还有异常判断)
    6.2 promise1 的 onFulfilled 或者 onRejected 执行结果报错了,此时promise2需要被reject
    6.3 promise1 的 onFulfilled 不是一个函数,提供默认函数做透传,promise2 以 promise1 的 value 触发 fulfilled
    6.4 promise1 的 onRejected 不是一个函数,提供默认函数做透传,promise2 以 promise1 的 reason 触发 reject

  2. resolvePromise

    resolvePromise(promise2, x, resolve, reject)

    7.1 如果 promise2 === x, 则 reject typeError
    7.2 如果 x 是一个 Promise,

    x 是 pending 时,promise2 必须也是 pending  
    x 是 resolve 时,promise2 必须以相同的 value resolve  
    x 是 reject 时,promise2 必须以相同的 reason reject  

    7.3 如果 x 是 object / function

    let then = x.then  
    使用try...catch...  
    then 如果是一个函数,通过 then.call(x) 来调用(改变 this 指向的)
    
    Object.defineProperty(x, 'then', get() {
        throw error
    })

你可能感兴趣的:(promise)