Promise(1):Promise/A+规范

与Promise最主要的交互方法是通过将函数传入它的then方法从而获取得Promise最终的值或Promise最终最拒绝(reject)的原因

术语

  • promise是一个包含了兼容promise规范then方法的对象或函数,
  • thenable 是一个包含了then方法的对象或函数。
  • value 是任何Javascript值。 (包括 undefined, thenable, promise等).
  • exception 是由throw表达式抛出来的值。
  • reason 是一个用于描述Promise被拒绝原因的值。

要求

2.1 Promise状态

一个Promise必须处在其中之一的状态:pending、fulfilled 或 rejected

  • 如果是pending状态,则promise可以转换到fulfilled或rejected状态
  • 如果是fulfilled状态,则promise不能转换成任何其它状态。必须有一个值,且这个值不能被改变
  • 如果是rejected状态,则promise不能转换成任何其它状态。必须有一个原因,且这个值不能被改变

“值不能被改变”指的是其identity不能被改变,而不是指其成员内容不能被改变

2.2 then方法

一个Promise必须提供一个then方法来获取其值或原因。 Promise的then方法接受两个参数:

jspromise.then(onFulfilled, onRejected)
复制代码
  1. onFulfilledonRejected 都是可选参数:
    onFulfilled
    onRejected
    
  2. 如果 onFulfilled 是一个函数:
    1. 它必须在 promise fulfilled 后调用,且 promisevalue 为其第一个参数
    2. 它不能在 promise fulfilled 前调用
    3. 不能被多次调用
  3. 如果 onRejected 是一个函数
    1. 它必须在 promise rejected 后调用,且 promisereason 为其第一个参数
    2. 它不能在 promise rejected 前调用
    3. 不能被多次调用
  4. onFulfilledonRejected 只允许在 execution context 栈仅包含平台代码时运行
  5. onFulfilledonRejected 必须被当做函数调用 (i.e. 即函数体内的 thisundefined )
  6. 对于一个 promise ,它的 then 方法可以调用多次
    1. promise fulfilled 后,所有 onFulfilled 都必须按照其注册顺序执行
    2. promise rejected 后,所有 OnRejected 都必须按照其注册顺序执行
  7. then 必须返回一个 promise [3.3]
    1. 如果 onFulfilledonRejected 返回了值 x , 则执行 Promise 解析流程 [[Resolve]](promise2, x)
    2. 如果 onFulfilledonRejected 抛出了异常e, 则 promise2 应当以e为 reason 被拒绝。
    3. 如果 onFulfilled 不是一个函数且 promise1 已经 fulfilled ,则 promise2 必须以 promise1 的值 fulfilled.
    4. 如果 OnReject 不是一个函数且 promise1 已经 rejected , 则 promise2 必须以相同的 reason 被拒绝.
jspromise2 = promise1.then(onFulfilled, onRejected);
复制代码

2.3 Promise解析过程

Promise解析过程 是以一个promise和一个值做为参数的抽象过程,可表示为[[Resolve]](promise, x). 过程如下;

  1. 如果promise 和 x 指向相同的值, 使用 TypeError做为原因将promise拒绝。

  2. 如果 x 是一个promise, 采用其状态 [3.4]

    1. 如果x是pending状态,promise必须保持pending走到x fulfilled或rejected
    2. 如果x是fulfilled状态,将x的值用于fulfill promise
    3. 如果x是rejected状态, 将x的原因用于reject promise
  3. 如果x是一个对象或一个函数

    1. 将 then 赋为 x.then. [3.5]
    2. 如果在取x.then值时抛出了异常,则以这个异常做为原因将promise拒绝
    3. 如果 then 是一个函数, 以x为this调用then函数, 且第一个参数是resolvePromise,第二个参数是rejectPromise,且:
      1. 当 resolvePromise 被以 y为参数调用, 执行 [[Resolve]](promise, y).
      2. 当 rejectPromise 被以 r 为参数调用, 则以r为原因将promise拒绝。
      3. 如果 resolvePromise 和 rejectPromise 都被调用了,或者被调用了多次,则只第一次有效,后面的忽略。
      4. 如果在调用then时抛出了异常,则
        1. 如果 resolvePromise 或 rejectPromise 已经被调用了,则忽略它
        2. 否则, 以e为reason将 promise 拒绝
  4. 如果 x 不是对象也不是函数,则以x为值 fulfill promise。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章