资讯专栏INFORMATION COLUMN

Promise学习笔记(二):规范

_Suqin / 2715人阅读

摘要:下一篇大概就是源码方面的学习笔记了龟速学习中这一次我是去看了下规范照例传送门图灵社区规范首先吧个人总结下该用的词解决结婚拒绝婉拒终值值传家宝拒因好人卡等等异常车祸理下概念我们的的就像是一场姻缘对吧解决呢就是结婚成功啦传家宝也如愿的传给下一代

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

这一次我是去看了下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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80366.html

相关文章

  • Promise学习笔记(三):源码core.js解析(上)

    摘要:源码阅读阶段先理解根本吧想快点理解的话可以直接跳到下个标题这部分根据理解将持续修改空函数用于判断传入构造器的函数是否为空函数如果为空函数构造一个对象并初始化状态为终值回调状态和队列记录内部最后的一次错误空对象标识表示发生了错误暴露模块接口为 源码阅读阶段 先理解Promise根本吧,想快点理解的话可以直接跳到下个标题.这部分根据理解将持续修改. Promise(fn) function...

    wuyangchun 评论0 收藏0
  • 2017年3月份前端资源分享

    平日学习接触过的网站积累,以每月的形式发布。2017年以前看这个网址:http://www.kancloud.cn/jsfron... 03月份前端资源分享 1. Javascript 175453545 Redux compose and middleware 源码分析 深入 Promise(二)——进击的 Promise Effective JavaScript leeheys blog -...

    ermaoL 评论0 收藏0
  • 2017年3月份前端资源分享

    平日学习接触过的网站积累,以每月的形式发布。2017年以前看这个网址:http://www.kancloud.cn/jsfron... 03月份前端资源分享 1. Javascript 175453545 Redux compose and middleware 源码分析 深入 Promise(二)——进击的 Promise Effective JavaScript leeheys blog -...

    kamushin233 评论0 收藏0
  • 2017年3月份前端资源分享

    平日学习接触过的网站积累,以每月的形式发布。2017年以前看这个网址:http://www.kancloud.cn/jsfron... 03月份前端资源分享 1. Javascript 175453545 Redux compose and middleware 源码分析 深入 Promise(二)——进击的 Promise Effective JavaScript leeheys blog -...

    yy736044583 评论0 收藏0

发表评论

0条评论

_Suqin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<