要求
Promise 的状态
一个 Promise 的当前状态必须为如下三种状态中的一种:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。html
等待态(Pending)
处于等待态时,promise 需知足如下条件:前端
能够迁移至执行态或拒绝态
执行态(Fulfilled)
处于执行态时,promise 需知足如下条件:promise
不能迁移至其余任何状态
必须拥有一个不可变的终值
拒绝态(Rejected)
处于拒绝态时,promise 需知足如下条件:异步
不能迁移至其余任何状态
必须拥有一个不可变的据因
这里的不可变指的是恒等(便可用 === 判断相等),而不是意味着更深层次的不可变(译者注: 盖指当 value 或 reason 不是基本值时,只要求其引用地址相等,但属性值可被更改)。函数
Then 方法
一个 promise 必须提供一个 then 方法以访问其当前值、终值和据因。this
promise 的 then 方法接受两个参数:htm
1
promise.then(onFulfilled, onRejected)
参数可选
onFulfilled 和 onRejected 都是可选参数。对象
若是 onFulfilled 不是函数,其必须被忽略
若是 onRejected 不是函数,其必须被忽略
onFulfilled 特性
若是 onFulfilled 是函数:blog
当 promise 执行结束后其必须被调用,其第一个参数为 promise 的终值
在 promise 执行结束前其不可被调用
其调用次数不可超过一次
onRejected 特性
若是 onRejected 是函数:开发
当 promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的据因
在 promise 被拒绝执行前其不可被调用
其调用次数不可超过一次
调用时机
onFulfilled 和 onRejected 只有在执行环境堆栈仅包含平台代码时才可被调用 注1
调用要求
onFulfilled 和 onRejected 必须被做为函数调用(即没有 this 值)注2
屡次调用
then 方法能够被同一个 promise 调用屡次
当 promise 成功执行时,全部 onFulfilled 需按照其注册顺序依次回调
当 promise 被拒绝执行时,全部的 onRejected 需按照其注册顺序依次回调
返回
then 方法必须返回一个 promise 对象 注3
1
promise2 = promise1.then(onFulfilled, onRejected);
若是 onFulfilled 或者 onRejected 返回一个值 x ,则运行下面的 Promise 解决过程:[[Resolve]](promise2, x)
若是 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e
若是 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值
若是 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因