对标一下 Promise/A+ 规范


对标一下 Promise/A+ 规范

Promise/A 是由 CommonJS 组织制定的异步模式编程规范,后来又经过一些升级,就是当前的 Promise/A+ 规范。上一节讲述的Promise的一些功能实现,就是根据这个规范来的。

本节内容概述

  • 介绍规范的核心内容
  • 状态变化
  • then方法
  • 接下来...

介绍规范的核心内容

网上有很多介绍 Promise/A+ 规范的文章,大家可以搜索来看,但是它的核心要点有以下几个,我也是从看了之后自己总结的

关于状态

  • promise 可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
  • promise 的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换

关于then方法

  • promise 必须实现then方法,而且then必须返回一个 promise ,同一个 promise 的then可以调用多次(链式),并且回调的执行顺序跟它们被定义时的顺序一致
  • then方法接受两个参数,第一个参数是成功时的回调,在 promise 由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在 promise 由“等待”态转换到“拒绝”态时调用

下面挨个介绍这些规范在上一节代码中的实现,所谓理论与实践相结合。在阅读以下内容时,你要时刻准备参考上一节的代码

状态变化

promise 可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)

拿到上一节的readFilePromise函数,然后执行const result = readFilePromise(someFileName)会得到一个Promise对象。

  • 刚刚创建时,就是 等待(pending)状态
  • 如果读取文件成功了,readFilePromise函数内部的callback中会自定调用resolve(),这样就变为 已完成(fulfilled)状态
  • 如果很不幸读取文件失败了(例如文件名写错了,找不到文件),readFilePromise函数内部的callback中会自定调用reject(),这样就变为 已拒绝(rejeced)状态

promise 的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换

这个规则还是可以参考读取文件的这个例子。从一开始准备读取,到最后无论是读取成功或是读取失败,都是不可逆的。另外,读取成功和读取失败之间,也是不能互换的。这个逻辑没有任何问题,很好理解。

then方法

promise 必须实现then方法,而且then必须返回一个 promise ,同一个 promise 的then可以调用多次(链式),并且回调的执行顺序跟它们被定义时的顺序一致

  • promise对象必须实现then方法这个无需解释,没有then那就不叫promise
  • “而且then必须返回一个promise,同一个 promise 的then可以调用多次(链式)” ———— 这两句话说明了一个意思 ———— then肯定要再返回一个promise,要不然then后面怎么能再链式的跟一个then呢?

then方法接受两个参数,第一个参数是成功时的回调,在 promise 由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在 promise 由“等待”态转换到“拒绝”态时调用

这句话比较好理解了,我们从一开始就在 demo 中演示。

接下来...

Promise的应用、规范都介绍完了,看起来挺牛的,也解决了异步操作中使用callback带来的很多问题。但是Promise本质上到底是一种什么样的存在,它是真的把callback弃而不用了吗,还是两者有什么合作关系?它到底是真的神通广大,还是使用了障眼法?

这些问题,大家学完Promise之后应该去思考,不能光学会怎么用就停止了。下一节我们一起来探讨~