返回

大揭秘,透过现象看本质——深入剖析Promise的底层原理

前端

Promise的状态机

Promise必须为以下三种状态之一:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦Promise被resolve或reject,就不能再迁移至其他任何状态(即状态immutable)。

Promise中的关键是要保证,then()方法在Promise的状态改变之后才能被调用,并且只能调用一次。为了实现这一点,Promise内部有一个状态机,该状态机负责管理Promise的状态转换,并确保then()方法只能在适当的时候被调用。

事件循环与Promise

在JavaScript中,事件循环是一个单线程事件处理机制,它负责处理来自不同来源的事件,并将其按照一定的顺序执行。当JavaScript执行一段代码时,它会将代码中的所有同步任务添加到执行栈中,并逐个执行这些任务。当执行栈中的任务全部执行完毕后,事件循环会将事件队列中的任务添加到执行栈中,并开始执行这些任务。

Promise的运行与事件循环密切相关。当一个Promise被创建时,它会处于等待态。当resolve或reject被调用时,Promise会从等待态变为执行态或拒绝态。此时,Promise会将then()方法添加到事件队列中,等待事件循环的处理。当事件循环将then()方法从事件队列中取出并执行时,then()方法会根据Promise的状态(执行态或拒绝态)来执行相应的处理逻辑。

微任务与Promise

在JavaScript中,微任务是一个比事件循环更优先级的任务队列。微任务队列中的任务会在事件循环的每一次迭代中被执行,并且在执行微任务队列中的任务时,不会执行事件队列中的任务。

Promise的then()方法会被添加到微任务队列中,而不是事件队列中。这意味着,当一个Promise被resolve或reject时,then()方法会被立即添加到微任务队列中,并在事件循环的下一轮迭代中被执行。这样做的好处是,它可以确保then()方法在Promise的状态改变之后立即被执行,而不会被其他事件队列中的任务打断。

Promise的链式调用

Promise的链式调用是指then()方法可以连续调用,形成一个链式结构。这种链式调用可以使代码更加简洁和易于阅读。

Promise的链式调用是通过闭包来实现的。当then()方法被调用时,它会返回一个新的Promise对象。这个新的Promise对象的状态取决于then()方法中传入的函数的执行结果。如果传入的函数执行成功,则新的Promise对象会变为执行态;如果传入的函数执行失败,则新的Promise对象会变为拒绝态。

结语

Promise是一个非常强大的工具,它可以使异步编程变得更加简单和易于管理。通过理解Promise的底层原理,我们可以更有效地使用Promise来编写出更加健壮和可靠的代码。