Promise学习笔记:规范

下一篇大概就是源码方面的学习笔记了…龟速学习中…

这一次我是去看了下Promises/A+规范
照例传送门:
图灵社区Promises/A+规范 http://www.ituring.com.cn/article/66566

首先吧个人总结下该用的词:

  1. 解决(fulfill/resolve): 结婚
  2. 拒绝(reject) 婉拒
  3. 终值/值(eventual value/value) 传家宝
  4. 拒因(reason) 好人卡等等
  5. 异常(exception) 车祸
  6. Promise
  7. thenable

理下概念,我们的的promise就像是一场姻缘对吧,解决呢就是结婚成功啦,传家宝也如愿的传给下一代(等待下一场姻缘),婉拒了就是求婚失败被人发好人卡啦,而结婚呢天灾人祸不可避免,而这些天灾人祸呢就是我们所说的异常了.

大概我自己脑洞有点大吧,我们还是来看代码吧

1
promise.then(onFulfilled, onRejected)

首先then的定义,

  • 接收onFulfilled, onRejected两个函数(不是函数就当缺席),这个也是我们上篇所说的then(undefined,onRejected)兼容catch的原因啦.
  • 如果我们传入的onFulfilled为函数,则会接受promise的 终值/值(eventual value/value) 作为第一个参数,并且能在promise状态为fulfilled时调用一次.同理我们的onRejected也差不多,重点是规定它们的一次性.
  • 同一个promise可以多次调用then方法,但是要注意顺序
  • then必须返回一个promise对象.
    1
    promise2 = promise1.then(onFulfilled, onRejected)

如果onFulfilled不是函数promise1状态为fulfilled,则promise2状态为fulfilled且值与promise1的值相同
如果onRejected不是函数promise1状态为rejected,那么promise2状态必须为rejected且与promise1的reason拒因相同.

不是上述情况,则

  1. then后终值为x/或者说promise1传递终值为x,则执行[Resolve]
  2. then抛出异常e,则将e作为拒因并设promise2为rejected

[Resolve]
这其实就是构造出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…我们来弄个图吧

clipboard.png

大概就是这样吧,其实就是内部的自调用取终值,然后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

理解有错的话希望指出,在看完源码看规范的循环中,以后写完源码篇理解有所加深的话会回来进行修改一下