欢迎来这里 前端杂谈, 聊聊前端
代码在github
《手写 Promise》是一个经典的问题,基本上大家上手都可以按照自己的理解,写出来一个 promise, 有一天个朋友问我,"手写 Promise 要写到什么程度才是合格的 ?", 这也引起了我的兴趣和思考, "怎么样的 Promise ,才是完美的呢 ? "
完美的 Promise
第一个问题就是怎么样才算是一个完美的 Promise 呢, 其实这个问题也不难,实现一个和原生 Promise "相同"的 Promsie,不就是完美的了, 那么第二个问题也就来了,原生的 Promise 是按照什么标准来实现的呢, 查阅了资料之后知道是按照 [Promises/A+] (https://promisesaplus.com/)标准来实现的, 具体的实现在 ECMA - sec-promise-objects 上有记载, 现在标准有了,我们就可以来实现一个"完美的 Promise"了
Promises/A+
接下来我们来看看Promises/A+
标准说了啥, 主要是两部分,一个是名词定义,一个是标准描述,其中标准描述由三个部分组成, 接下来我们简单介绍下:
Terminology
这部分是名词定义,主要是描述了各个名词在标准中的定义
promise
: 是具有then
行为符合规范的方法的object
或function
, 这里需要注意的是不是function
是then
,是function
中有then
方法thenable
: 是定义then
方法的object
或函数
,这个和上面promise
的区别在于then
是一个函数,不一定需要符合规范行为value
: 是任何合法的 javascript 值,包括undefined
、thenable
、promise
,这里的value
包含了thenable
和promise
,结合下面的规范,会发现是一个可嵌套的关系exception
: 是一个通过throw
关键词抛出来的值reason
: 表示一个promise
状态是rejected
的原因