Promises/A+规范

68 阅读3分钟

1 术语

1.1 promise是一个有then方法的对象或者函数,行为遵循本规范

1.2 thenable 是一个有then方法的对象或者是函数

1.3 value是一个合法的javascript值(包括undefined、thenable,promise)

1.4“exception” 是使用throw抛出的值

1.5reason 是promise状态失败时的值,也就是reject的参数,表示拒绝的原因

2 规范

2.1 promise状态

promise必须是下面3个状态之一 pending, fulfilled, 或者rejected.

2.1.1 promise处于pending状态
    2.1.1.1 可以变成fulfilled, 或者rejected状态
2.1.2 promise处于fulfilled状态
    2.1.2.1 不能变成其他状态
    2.1.2.2 必须有一个值,这个值不能改变
2.1.2 promise处于rejected状态
    2.1.2.1 不能变成其他状态
    2.1.2.2 必须有一个reason,这个reason不能改变

2.2 then方法

promise 应该提供一个then方法,用来访问最终的结果,无论是value还是reason

then方法有2个参数

promise.then(onFulfilled, onRejected)
2.2.1 onFulfilled和onRejected是2个可选参数

    2.2.1.1 如果onFulfilled不是一个函数,必须忽略它

    2.2.1.2 如果onRejected不是一个函数,必须忽略它

2.2.2 如果onFulfilled是一个函数

    2.2.2.1 在promise变成 fulfilled 时,应该调用 onFulfilled,参数是value.

    2.2.2.2 在promise变成 fulfilled 之前,不应该被调用.

    2.2.2.3 只能被调用一次

2.2.3 如果onFulfilled是一个函数

    2.2.3.1 在promise变成 rejected时,应该调用 onRejected,参数是reason.

    2.2.3.2 在promise变成 rejected之前,不应该被调用.

    2.2.3.3 只能被调用一次

2.2.4 onFulfilled和onRejected在执行上下文堆栈仅包含平台代码之前,不得调用

2.2.5 onFulfilled和onRejected必须作为函数调用(即没有此值)

2.2.6 then可以被同一个promise调用多次

    2.2.6.1 promise处于fulfilled 状态,所有的 onFulfilled 回调都需要按照then的顺序执行,也就是按照注册顺序执行

    2.2.6.2 promise状态变成 rejected 后,所有的 onReject 回调都需要按照then的顺序执行,也就是按照注册顺序执行

2.2.7 then方法必须返回一个promise
 promise2 = promise1.then(onFulfilled, onRejected)
    2.2.7.1 只要 onFulfilled 或者 onRejected 返回一个值x,promise2都会进入 onFulfilled 状态
    
    2.2.7.2 如果 onFulfiled 或者onRejected 抛出一个异常e,则promise2 必须拒绝执行,并且返回拒因 e
    
    2.2.7.3 如果 onFulfilled 不是函数, promise1 状态变为已完成, promise2 必须成功执行并且返回相同的值
    
    2.2.7.4 如果 onRejected不是函数,promise1 状态变为已拒绝,promise2 必须执行拒绝回调并返回相同的据 因

2.3解决过程

解决过程是一个抽象的操作,输入一个promise和一个value[Resolve],如果x有then方法,看上去像一个promise,解决程序即尝试使 promise 接受 x的状态;否则其用 x 的值来执行 promise。

执行[Resolve]的步骤

2.3.1 如果 promise 和x指向同一对象,以 TypeError 为据因拒绝执行 promise

2.3.2 如果x是一个promise

    2.3.2.1 如果x是pending状态,promise需要保持等待,直到x变成fulfilled 或者rejected 状态

    2.3.2.2 如果x处于fulfilled 状态,用相同的值执行promise

    2.3.2.3 如果x处于this状态,用相同的理由执行promise

2.3.3 如果x是一个对象或者函数

    2.3.3.1 尝试执行x.then方法

    2.3.3.2 如果取 x.then 的值时抛出错误 e,则以 e为据因拒绝 promise

    2.3.3.3 如果then是函数 将x作为函数的作用域 this调用。传递两个回调函数作为参数,第一个参数叫做 resolvePromise ,第二个参数叫做rejectPromise

        2.3.3.3.1 如果 resolvePromise 以值y为参数被调用,则运行[Resolve]](promise,y)

        2.3.3.3.2 如果 rejectPromise 以据因r为参数被调用,则以据因r拒绝 promise

        2.3.3.3.3 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略;

        2.3.3.3.4 如果调用 then 方法抛出了异常e

            2.3.3.3.4.1 如果 resolvePromise 或 rejectPromise 已经被调用,则忽略

            2.3.3.3.4.2 否则以 e为据因拒绝 promise

    2.3.3.4 如果 then 不是一个函数,则以x为参数将promise变成已完成状态

2.3.4 如果x不是一个对象或者函数,以x为参数将 promise变为已完成状态