Promise/A+ 规范学习(翻译)

194 阅读2分钟

Promises/A+规范

  1. 术语

    1. “promise”是个对象或者方法,有then方法
    2. “thenable”是个对象或者方法,定义then方法
    3. “value”是任何javascript的合法值
    4. “exception”是通过throw抛出的值
    5. “reason”是Promise被拒绝的理由
  2. 需求

    1. Promise状态

      promise的状态一定是处于“pending”(等待),“fulfilled”(履行),“rejected”(拒绝)三个之中

    2. Then方法

      Promise必须提供一个then方法去获取它的当前状态,最终值或者否定的理由

      then方法接受两个参数,

      promise.then(onFulfilled, onRejected)
      
      1. onFulfilledonRejected两个参数都不是必填的,如果不是函数类型的参数,会被忽略
      2. 如果onFulfilled是函数
        1. 在promise被履行之后被调用,只会被调用一次
      3. 如果onRejected是函数
        1. 在promise被拒绝之后,只会被调用一次
    3. then方法必须返回一个promise对象

      promise2 = promise1.then(onFulfilled, onRejected);
      
      1. 如果onFulfilledonRejected方法返回了一个值x,那么就需要进行进一步的程序判断[[Resolve]](promise2, x)
      2. 如果onFulfilledonRejected方法执行过程中抛出异常e,那么promise2被拒绝,理由是异常e
      3. 如果onFulfilled不是一个函数,promise1是fulfilled状态,那么promise2被履行,理由和promise1一样
      4. 如果onRejected不是一个函数, promise1是rejected状态,那么promise2被拒绝,理由和promise1一样
    4. 承诺解决过程([[Resolve]](promise, x))

      1. 如果promise和x是同一个对象,promise被拒绝,理由是 TypeError
      2. 如果x是promise对象,那么就采用他的promise状态
        1. 如果x是pending状态,等待被fulfilled或者rejected
        2. 如果x是fulfilled状态,promise被履行,理由和x一样
        3. 如果x是rejected状态,promise被拒绝,理由和x一样
      3. 如果x是个对象或者函数
        1. x.then赋值给then
        2. 当获取x.then值的时候,抛出异常e的时候,promise被拒绝,理由是e
        3. then是一个函数的时候,调用这个函数(把x当作this),第一个参数是resolvePromise,第二个参数是rejectPromise
          1. 当resolvePromise被调用且y作为参数的时候,继续执行承诺解决过程[[Resolve]](promise, y)
          2. 当rejectPromise被调用且r作为参数,promise被拒绝,理由是r
          3. resolvePromise,rejectPromise都被调用的时候,谁先调用谁生效,后面调用的将被忽略
        4. then 不是一个函数的时候,promise被fulfile,理由是x
      4. 如果x不是对象也不是函数,promise被fulfilled,理由就是x