乐趣区

关于promise: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})
退出移动版