![v2-859f6918e6e2ef2652a0b1765ab83718_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a68c808c-2930-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-859f6918e6e2ef2652a0b1765ab83718_1440w.jpg?source=172ae18b)
规范
promise有多种规范,像 promise/A、 promise/B、 promise/D 以及 promise/A 的升级版 promise/A+。
ES6中采用的规范是promise/A+。
状态
一个promise的状态只有三种:等待态Pending、执行态Fulfilled和拒绝态Rejected。
- 处于等待态时,promise可以迁移到执行态或者拒绝态。
- 处于执行态时,promise不能迁移到其他任何状态,且必须拥有一个不可变的终值。
- 处于拒绝态时,promise不能迁移到其他任何状态,且必须拥有一个不可变的据因。
代码结构
构造函数
function
方法
Promise
实现构造函数
由上述对于promise状态的描述,可以得到以下的构造函数。
function
Then方法
一个promise必须提供一个then方法可以访问其当前值、终值和据因。promise的then方法接受两个参数:
promise
onFulfilled和onRejected都是可选的参数
- 如果onFulfilled不是函数,其必须被忽略
- 如果onRejected不是函数,其必须被忽略
且then方法必须返回一个promise对象:
promise2
且onFulfilled和onRejected不能同步调用,必须异步调用。
实现then
Promise
链式调用
在使用promise的时候经常用到new Promise().then().then()的写法,这个就是链式调用了。
之前的then方法已经默认返回了一个promise,但是还没有完全实现链式调用的写法。还需要将这个promise2返回的值传递到下一个then中去。
如果在第一个then方法中return了一个值,这个值就称为x。需要对x进行判断,从而根据x的值来改变promise2的状态,而判断x的函数叫做resolvePromise。
- 如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行下面的 Promise 解决过程:[[Resolve]](promise2, x)
- 如果 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e
- 如果 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值
- 如果 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因
promise解决过程
如果 x 为对象或者函数:
- 把 x.then 赋值给 then
- 如果取 x.then 的值时抛出错误 e ,则以 e 为据因拒绝 promise
- 如果 then 是函数,将 x 作为函数的作用域 this 调用之。
如果 x 不为对象或者函数,以 x 为参数执行 promise
实现resolvePromise
function
之后可以将then方法修改如下:
Promise
完整代码
var
参考地址
Promises/A+promisesaplus.com Promise原理与实现www.jianshu.com![v2-4e01073205e7fb3285ce84b915ac8bb6_ipico.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a68c808c-2930-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-4e01073205e7fb3285ce84b915ac8bb6_ipico.jpg)