150行实现Promise 90%的功能

2,541 阅读2分钟

Promise的实现也算是一个老话题了,网上同类型的文章和示例代码不少,其中不乏许多优秀的实现。但因为Promise“魔幻”的API,以及背后包含的异步处理的独特思想,使得实现一个Promise仍旧是一个富有挑战和趣味性的问题。

这里笔者给出一个自己的实现。为了更好地解释实现的过程,我把Promise的实现分成了10个阶段,并按一个阶段一次提交的规则,完成了下面这个代码库

github.com/lqt0223/pro…

这个实现基本覆盖了Promise的以下功能:

  1. 基本功能:promise是一个对象,它接收一个函数作为参数。当promise被创建时,函数会被立即执行。

  2. 设定异步操作:可调用Promise.prototype.then来设定一些未来完成的操作。当promise对象变成resolved状态时,在then体中的回调函数会被调用,异步的值也将被获取。

  3. 链式调用:调用Promise.prototype.then将返回一个新的promise对象。在promise链中,当第一个promise中的步骤开始执行后,这个链便会自动地不断尝试resolve后续的promise直到结束。

  4. 状态控制:一个promise对象被创建后,初始状态为pending,后续会变为resolved或rejected中的任意一种状态。

  5. 错误处理:在promise中处理错误有几种方式:调用Promise.prototype.then时传入错误处理函数,或者调用Promise.prototype.catch

  6. 错误传递:当一个位于链中的promise状态变成rejected时,错误会向链尾部传递,直到找到一个错误处理函数或catch体。处于reject发生位置和错误处理函数之间的异步操作,将不会被执行。当错误被处理后,promise链才会恢复执行。

  7. then / catch体中promise的自动解析:当then / catch体中设定的回调函数返回一个promise时,这个promise将会被自动解析,其产生的值或错误也会被传递至后续的promise

  8. 异常捕获:一个promise对象不仅可以被显式地reject,也可以捕获其自身执行时抛出的异常或错误。

  9. 静态方法: Promise.resolve, Promise.reject, Promise.all & Promise.reject

  10. then的多次调用: 多次调用Promise.prototype.then可以将一些异步操作设定为并发执行

针对上述功能,代码库中也打上了10个对应的tag,方便切换查看。

最后,感谢您的star,分享和交流!