在承诺得到解决之前,指令正在被执行

阅读时长 4 分钟读完

在前端开发中,异步编程是一项非常重要的技能。其中一个主要的异步编程模型是 Promise。Promise 是一种用于处理异步操作结果的对象,可以使异步代码更容易编写和维护。然而,在使用 Promise 时,有些情况需要特别注意,比如 Promise 的状态和执行顺序。

Promise 状态

Promise 有三种状态:pending(等待)、fulfilled(已完成)和 rejected(已拒绝)。当 Promise 被创建时,它处于 pending 状态。在异步操作完成后,Promise 将变为 fulfilled 或 rejected 状态。

在执行异步操作时,Promise 可以通过 resolve 和 reject 方法改变其状态。resolve 函数将 Promise 的状态从 pending 改为 fulfilled,并将数据传递给 then 方法;而 reject 函数则将 Promise 的状态从 pending 改为 rejected,并将错误信息传递给 catch 方法。

下面是一个简单的例子,演示了如何创建并使用 Promise:

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

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

在这个例子中,我们创建了一个 Promise 对象,并在一秒后返回一个随机数。如果这个随机数大于 0.5,我们使用 resolve 函数将 Promise 的状态从 pending 改为 fulfilled,并将随机数传递给 then 方法;否则,我们使用 reject 函数将 Promise 的状态从 pending 改为 rejected,并将错误信息传递给 catch 方法。

Promise 执行顺序

在执行 Promise 时,需要注意 Promise 的执行顺序。Promise 的 then 和 catch 方法都是异步执行的,因此它们的执行顺序可能与代码顺序不同。

以下是一个简单的例子,演示了 Promise 的执行顺序问题:

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

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

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

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

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

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

在这个例子中,我们创建了两个 Promise 对象并分别在一秒和两秒后解决它们。在解决第一个 Promise 对象之前,我们打印了一条消息 "After promise1",在解决第二个 Promise 对象之前,我们打印了另一条消息 "After promise2"。执行这段代码,我们得到的输出结果如下:

可以看到,虽然第二个 Promise 对象的解决时间比第一个要早,但是它的 then 方法却在第一个之后执行。这是因为 then 和 catch 方法是异步执行的,会被放入微任务队列中,在当前主线程执行完成后再执行。

总结

在使用 Promise 时,需要注意 Promise 的状态和执行顺序。Promise 的状态有三种:pending(等待)、fulfilled(已完成)和 rejected(已拒绝)。在异步操作完成后,Promise 将变为 fulfilled 或 rejected 状态。在执行 Promise 时,需要注意 Promise 的执行顺序,因为 then 和 catch 方法都是异步执行的,并且会被放入微任务队列中。我们可以通过掌握 Promise 的状态和执行顺序,更好地编写和维护异步代码。

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

纠错
反馈