精读Javascript系列(10) Promise——Promise/A+规范解读Promise

前言:必要前提

阅读本文有一个很重要的前提—— 就是知道 Promise是怎么构造的,也可以说知道在构造Promise实例过程中究竟发生了什么,是理解Promise必不可缺的关键一步。

试着问下自己这几个问题:

  • Promise的接收的回调函数是怎么执行的?(MDN称之为executor
  • resolvereject是什么? 是谁提供的?
  • 返回的Promise是怎么确定状态的?

如果回答这些问题没有把握,可以参考:

  • MDN Promise
  • Promise简介
  • 其他博文:尽可能是 github上的,分析得头头是道、有理有据,但有些难理解就是了。

如果上面的问题都能很好的回答上来,那么就正式开始用Promise/A+规范解读Promise(虽说如此,还是要结合MDNtutorialpoint上的内容)。

开始吧。


预备:Promise基本构造(非规范)

注意

  • 这不是Promise/A+的一部分,但是知道它对于理解Promise规范的细节很有帮助。
  • 下面的内容我会在括号中引用,或是在伪代码中引用。

任何一个Promise都会有两个最关键的部分:

  • [[PromiseStatus]] : 表明操作执行后的状态。默认为pending ; 在Firefox浏览器中,该字段为state
  • [[PromiseValue]] :是保存在Promise中的结果,它可能是一个reason(拒绝原因,异常.etc); 或是一个value(成功操作后提供的结果)。

关于[[PromiseStatus]][[PromiseValue]]的设置:

  1. 在调用resolve函数时,如果提供了参数y; 那么[[PromiseValue]]则被设为y的值。此时[[PromiseStatus]]将切换为fulfilled (或resolved) ; 例如:resolve(y)
  2. 在调用reject函数时,如果提供了异常或一个值r, 那么[[PromiseValue]]将被设为r。它可能是一个异常(Exception)。此时[[PromiseStatus]]将切换为rejected。 例如:reject(r)throw r

一旦[[PromiseStatus]]被设为fulfilledrejected二者任何一个状态,都可以说该Promise被settled

总结如下:
任何一个Promise实例prvaluereason都能表示为:

pr . [[PromiseValue]] // 它可能是value ,也可能是 reason。

任何一个Promise实例pr的状态都能表示为:

pr . [[PromiseStatus]] // pending / fulfilled / rejected 三者之一。


Promise 与 then方法

注意:

  • 参考来源: Promise/A+规范
  • 虽然是参考规范,但是并非是规范的翻译,小生也没有翻译规范的能力;下文大多是阅读规范后的理解。

Promise/A+规范规定,Promise必须为以下三种状态之一:

  1. pending : 操作还未确定结果。此时promise状态(即[[PromiseStatus]])可以切换到fulfilledrejected
  2. fulfilled:操作已经成功完成。无法再切换到其他状态。此时必须有一个确定的value即[[PromiseValue]]无法再更改
  3. rejected:操作已经失败。无法再切换到其他状态。此时必须有一个确定的reason即[[PromiseValue]]无法再更改

任何一个promise实例都必须有一个then方法;同样的,任何具有then方法的对象都可以称之为thenable对象。
如下所示:

promise.then(onFulfilled, onRejected)

  1. onFulfilledonRejected都是可选的,但是它们如果不是函数,都会被忽略。注意它们只能在promise被settled后调用并且只能被调用一次
  2. onFulfilled是一个函数时,promise的状态为fulfilled时被调用。并将promisevalue(即[[PromiseValue]])作为onFulfilled的第一个参数。
  3. onRejected是一个函数时,promise的状态为 rejected 状态时被调用,并且 promisereason(也是[[PromiseValue]]) 作为它的第一个参数。

注意

  • 只有在当前任务(即宏任务)完成后才能调用onFulfilled
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值