下一篇大概就是源码方面的学习笔记了...龟速学习中...
这一次我是去看了下Promises/A+规范
照例传送门:
图灵社区Promises/A+规范 http://www.ituring.com.cn/art...
首先吧个人总结下该用的词:
解决(fulfill/resolve): 结婚
拒绝(reject) 婉拒
终值/值(eventual value/value) 传家宝
拒因(reason) 好人卡等等
异常(exception) 车祸
Promise
thenable
理下概念,我们的的promise就像是一场姻缘对吧,解决呢就是结婚成功啦,传家宝也如愿的传给下一代(等待下一场姻缘),婉拒了就是求婚失败被人发好人卡啦,而结婚呢天灾人祸不可避免,而这些天灾人祸呢就是我们所说的异常了.
大概我自己脑洞有点大吧,我们还是来看代码吧
promise.then(onFulfilled, onRejected)
首先then的定义,
接收onFulfilled, onRejected两个函数(不是函数就当缺席),这个也是我们上篇所说的then(undefined,onRejected)兼容catch的原因啦.
如果我们传入的onFulfilled为函数,则会接受promise的 终值/值(eventual value/value) 作为第一个参数,并且只能在promise状态为fulfilled时调用一次.同理我们的onRejected也差不多,重点是规定它们的一次性.
同一个promise可以多次调用then方法,但是要注意顺序
then必须返回一个promise对象.
promise2 = promise1.then(onFulfilled, onRejected)
如果onFulfilled不是函数且promise1状态为fulfilled,则promise2状态为fulfilled且值与promise1的值相同
如果onRejected不是函数切promise1状态为rejected,那么promise2状态必须为rejected且与promise1的reason拒因相同.
不是上述情况,则
then后终值为x/或者说promise1传递终值为x,则执行[[Resolve]](promise2,x)
then抛出异常e,则将e作为拒因并设promise2为rejected
[[Resolve]](promise2,x)
这其实就是构造出promise2的一个过程
X = promise的终值(传递过来的
promise2 = then返回的promise对象
如果x有then方法,并且看起来像是Promise,则尝试使promise2接受x的状态;否则用x的值来**执行**promise
这一条,其实包含在我们下面的流程里,不理解不要紧,我们先看整体.
x === promise2
拒因TypeError,执行reject promise
x为Promise对象
尝试让promise2接收x的state(状态)
如果x处于pending,则同步其状态
如果x处于fulfilled,则用同样的值来执行fulfilled promise
如果x处于rejected,则用同样的拒因来执行reject promise
x为对象或者函数typeof newValue === 'object' || typeof newValue === 'function'
var then = x.then (取值失败就把异常e作为拒因,执行reject promise)
typeof then ==== 'function' 如果then是函数
---------------------------------------------
var newthen = then.bind(x) x作为then函数内部的this指针.
newthen(resolvePromise,resolvePromise)
如果resoleve被调用且值为y,则执行[[Resolve]](promise2,y)
如果rejectPromise被调用且reason为r,则用r来reject promise
如果resolvePromise和rejectPromise都被调用,或者多次调用参数相同,则优先采用首次调用!并且忽略剩下的调用
如果then 方法抛出异常e
resolvePromise或rejectPromise已经被调用,则忽略该异常
否则用e作为拒因来reject promise
--------------------------------------------
如果then不是函数类型
用x来fulfill promise
如果x不是函数也不是对象
用x来fulfill promise
以我这么小的脑容量,还是挺难理解上面这串东西的,还是自己先理一下吧...
根据x的不同进行不同处理,难点在于当传递来的终值为thenable对象,我们就要对其进行一定程度上的判断处理,x.then为函数时,我们需要将x作为then函数内部的this指针,让resolvePromise为第一个参数,rejectPromise为第二个参数,调用then函数.(这里是在内部)
然后这个x.then的执行结果就是新的x...我们来弄个图吧
大概就是这样吧,其实就是内部的自调用取终值,然后then的终止有出现在哪里呢
完成终止在fulfill promise.
x为Promise,x处于fulfilled,则用同样的值来执行fulfill promise
x为对象或函数,x.then不是函数类型,用x来fulfill promise
如果x不是函数也不是对象,用x来fulfill promise
失败终止在reject promise
x === promise2,拒因TypeError,执行reject promise
x为Promise,x处于rejected,则用同样的拒因来执行reject promise
x为对象或函数,x.then取值失败并得到一个异常e,那么将e作为拒因来执行reject promise.
x为对象或函数,x.then为函数类型,rejectPromise被调用且reason为r,则用r来reject promise
x为对象或函数,x.then为函数类型,x.then抛出异常e并且 resolvePromise和rejectPromise没有被调用,e作为拒因来reject promise
理解有错的话希望指出,在看完源码看规范的循环中,以后写完源码篇理解有所加深的话会回来进行修改一下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。