Promise的实现也算是一个老话题了,网上同类型的文章和示例代码不少,其中不乏许多优秀的实现。但因为Promise“魔幻”的API,以及背后包含的异步处理的独特思想,使得实现一个Promise仍旧是一个富有挑战和趣味性的问题。
这里笔者给出一个自己的实现。为了更好地解释实现的过程,我把Promise的实现分成了10个阶段,并按一个阶段一次提交的规则,完成了下面这个代码库
这个实现基本覆盖了Promise的以下功能:
-
基本功能:promise是一个对象,它接收一个函数作为参数。当promise被创建时,函数会被立即执行。
-
设定异步操作:可调用
Promise.prototype.then
来设定一些未来完成的操作。当promise对象变成resolved状态时,在then体中的回调函数会被调用,异步的值也将被获取。 -
链式调用:调用
Promise.prototype.then
将返回一个新的promise对象。在promise链中,当第一个promise中的步骤开始执行后,这个链便会自动地不断尝试resolve后续的promise直到结束。 -
状态控制:一个promise对象被创建后,初始状态为pending,后续会变为resolved或rejected中的任意一种状态。
-
错误处理:在promise中处理错误有几种方式:调用
Promise.prototype.then
时传入错误处理函数,或者调用Promise.prototype.catch
。 -
错误传递:当一个位于链中的promise状态变成rejected时,错误会向链尾部传递,直到找到一个错误处理函数或catch体。处于reject发生位置和错误处理函数之间的异步操作,将不会被执行。当错误被处理后,promise链才会恢复执行。
-
then / catch体中promise的自动解析:当then / catch体中设定的回调函数返回一个promise时,这个promise将会被自动解析,其产生的值或错误也会被传递至后续的promise
-
异常捕获:一个promise对象不仅可以被显式地reject,也可以捕获其自身执行时抛出的异常或错误。
-
静态方法:
Promise.resolve
,Promise.reject
,Promise.all
&Promise.reject
-
then的多次调用: 多次调用
Promise.prototype.then
可以将一些异步操作设定为并发执行
针对上述功能,代码库中也打上了10个对应的tag,方便切换查看。
最后,感谢您的star,分享和交流!