Promise的实现也算是一个老话题了,网上同类型的文章和示例代码很多,其中不乏许多优秀的实现。但由于Promise“魔幻”的API,以及背后包含的异步处理的独特思想,使得实现一个Promise仍旧是一个富有挑战和趣味性的问题。git
这里笔者给出一个本身的实现。为了更好地解释实现的过程,我把Promise的实现分红了10个阶段,并按一个阶段一次提交的规则,完成了下面这个代码库github
github.com/lqt0223/pro…promise
这个实现基本覆盖了Promise的如下功能:并发
基本功能:promise是一个对象,它接收一个函数做为参数。当promise被建立时,函数会被当即执行。异步
设定异步操做:可调用Promise.prototype.then
来设定一些将来完成的操做。当promise对象变成resolved状态时,在then体中的回调函数会被调用,异步的值也将被获取。函数
链式调用:调用Promise.prototype.then
将返回一个新的promise对象。在promise链中,当第一个promise中的步骤开始执行后,这个链便会自动地不断尝试resolve后续的promise直到结束。prototype
状态控制:一个promise对象被建立后,初始状态为pending,后续会变为resolved或rejected中的任意一种状态。code
错误处理:在promise中处理错误有几种方式:调用Promise.prototype.then
时传入错误处理函数,或者调用Promise.prototype.catch
。对象
错误传递:当一个位于链中的promise状态变成rejected时,错误会向链尾部传递,直到找到一个错误处理函数或catch体。处于reject发生位置和错误处理函数之间的异步操做,将不会被执行。当错误被处理后,promise链才会恢复执行。get
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,分享和交流!