JavaScript ES6 Promises: 为什么在 resolve 后继续执行?

最近,在学习 JavaScript Promise 的过程中,我发现了一个有趣的问题:当 Promise 对象被 resolve 后,为什么还会继续执行后面的代码呢?这个问题在初学阶段可能会让人困惑,但实际上,它涉及到 Promise 执行原理的深层次理解。本文将探讨这个问题并提供一些指导意义。

Promise 基础

为了更好地理解这个问题,我们先来复习一下 Promise 的基本知识。

Promise 是 JavaScript 中一种用于异步编程的机制,可以简化异步代码的写法,并避免回调地狱的问题。在 ES6 中引入了 Promise 标准,使得 Promise 更加易用和可靠。一个 Promise 对象包含三种状态:pending、fulfilled 和 rejected。当一个异步操作完成后,Promise 对象会从 pending 状态转变为 fulfilled 或者 rejected 状态,表示异步操作已经成功或者失败。

Promise 对象的定义通常如下所示:

----- ------- - --- ----------------- ------- -- -
  -- ----
  -- -------- -
    --------------
  - ---- -
    -------------
  -
---

其中,resolve 和 reject 分别是两个函数,用于将 Promise 对象从 pending 状态转变为 fulfilled 或者 rejected 状态。

Promise 的执行顺序

了解了 Promise 的基本知识之后,我们来看一下 Promise 的执行顺序。当一个 Promise 对象被创建后,它会立即执行传入的异步操作,并将自己的状态设置为 pending。接着,当异步操作完成时,Promise 对象会调用 resolve 或 reject 函数,将自己的状态设置为 fulfilled 或 rejected,并将相应的结果传递给这两个函数。此时,Promise 对象的状态转变完成,同时会触发 then 方法或 catch 方法中对应的回调函数。

下面是一个简单的示例代码:

----- ------- - --- ----------------- ------- -- -
  ----------------------
  --------------------- -
    ----------------------
    ----------------
  -- ------
---

------------------- -- -
  ----------------- ----------- --------
-------------- -- -
  ------------------ ----------- -------
---

在这个示例中,Promise 对象被创建后,立即执行了一个异步操作,并将自己的状态设置为 pending。随后,我们使用 setTimeout 模拟了一个异步操作,1 秒钟后将 Promise 对象的状态设置为 fulfilled,并将其结果传递给 resolve 函数。最后,我们使用 then 方法注册了一个回调函数,当 Promise 对象状态转变为 fulfilled 时,该函数会被调用,并获取到 Promise 的成功结果。在这个示例中,控制台输出顺序如下:

------
------
---- -------------

为什么 Promise 在 resolve 后还会继续执行?

现在,回到本文最初的问题:为什么 Promise 在 resolve 后还会继续执行?

这个问题涉及到 Promise 异步执行的机制。在 JavaScript 中,所有的代码都是同步执行的,但是异步操作(如定时器、网络请求等)会被放入事件循环队列中,等待主线程执行完毕后再执行。当 Promise 对象被创建时,它会立即执行传入的异步操作,并将自己的状态设置为 pending。然而,在异步操作完成前,Promise 对象并没有真正地阻塞主线程的执行,也就是说,JavaScript 主线程会继续执行下面的代码。

因此,当 Promise 对

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/28051