promise

210 阅读2分钟

一、promise/A+ 标准解读

1. Promise状态
  • pending
    • 可以转为fulfilled/rejected状态
  • fulfilled
    • 不能转为别的状态
    • 必须有一个不可变(内存地址)的返回值
  • rejected
    • 不能转为别的状态
    • 必须有一个不可变(内存地址)的返回原因
graph LR
([pending]) --> ([fulfilled]) --> ([必须有一个不可变(内存地址)的返回值]) 
([pending]) --> ([rejected]) --> ([必须有一个不可变(内存地址)的返回原因])
2. then方法
  • promise.then(onFulfilled,onRejected)
  • onFulfilled与onRejected如果不是函数,忽略
  • onFulfilled/onRejected 如果是函数
    • 在Fulfilled/Rejected后调用,把promise的成功值/失败原因作为第一个参数
    • 在成功/失败之前不能被调用
    • 该函数只执行一次
  • onFulfilled/onRejected必须被作为函数调用
  • then可以被同一个promise多次调用(回调按照调用顺序执行)
  • then必须返回一个promise
3. 处理过程
  • 如果 promise 和 x 是相同的, 则以 promise的 TypeError 报错.
  • 如果 x 是一个 promise对象, 则使 promise 接受 x 的状态:
    • 如果 x 处于等待状态, promise 需保持为等待态直至 x 被执行或拒绝
    • 如果 x 处于执行态,用相同的值执行 promise
    • 如果 x 处于拒绝态,用相同的据因拒绝 promise
  • x 是对象或者函数时
    • 把 x.then 赋值给 then 方法
    • 如果在获取属性x.then的过程中导致抛出异常e,则拒绝promise 并用e 作为拒绝原因。
    • 如果then是函数,则将x作为函数的作用域的this被绑定并调用。传递两个回调函数作为参数,第一个参数叫做resolvePromise,第二个参数叫做rejectPromise:
      • 如果 resolvePromise 以值 y为参数被调用,则运行 [[Resolve]](promise, y)
      • 如果rejectPromise 以据因r为参数被调用,则以据因r拒绝promise
      • 如果resolvePromise 和 rejectPromise均被调用,或者被同一参数调用了多次,则优先采用首次调用并忽略剩下的调用
      • 如果调用then方法抛出了异常e:
        • 如果resolvePromise 或rejectPromise已经被调用,则忽略它
        • 否则以e为拒绝promise 的原因
    • 如果then不是函数,以x为参数执行 promise
  • 如果x不是对象或者函数,以x为参数执行 promise

二、实现