手写Promise笔记
手写Promise
笔记
掘金上看见一个20
行的Promise
实现,主要是链式调用,感觉很不错,学习学习。
原文出处:最简实现Promise,支持异步链式调用(20行)
Promise
直接上代码吧。
1 | // Promise构造函数 |
参数excutor
为一个函数,这个函数有两个参数。
一个是resolve
,一个是reject
,这个实现为简单实现,所以没有第二个参数,主要为实现链式调用。
Promise
构造函数中的onResolvedCallback
为一个待调用的函数数组。
当通过then
函数注册回调的时候,会把回调函数存在onResolvedCallback
数组中。
then
函数规范中有提到,必须返回一个新的Promise
对象,基于这个可以实现链式调用。
then
如何返回也在规范中有提及,如果回调函数返回了一个Promise
,那么then
返回的Promise
就要使用函数返回的Promise
的值(value
)。
如果不是函数返回的不是Promise
,那么then
返回的Promise
就直接以这个值来解决。
resolve
函数是一个完成函数,会把Promise
的状态从pending
转为resolved
,并且调用全部注册的回调。
resolve
为啥要通过setTimeout
调用呢?可以看下面的代码。
1 | var promise = new Promise(function(resolve,reject) { |
我们构建了一个promise
,直接的将这个promise
解决掉(调用resolve
)。
resolve
会把onResolvedCallback
的函数逐一地执行。
注意,这时候的操作都是同步的,也就是这时的then
注册回调还没有执行,导致了then
方法没有被执行。
使用了setTimeout
,使得更改状态以一个新的任务执行,也就是在当前代码执行完之后再执行,使得回调函数可以注册到onResolvedCallback
里面。使得then
的表现正常。
需要注意,Promise
应该是以微任务的形式来进行resolve
的,而不是以任务,这个在之前的关于task
,microtask
的文章中有说到。