理解 JavaScript Promise 中的 Thenable

JavaScript Promise 是一种强大的异步编程模式,但是其内部运作机制不够直观,容易出现一些难以捉摸的行为。其中一个常见的问题就是 Promise 中 Thenable 的使用。

Thenable 是什么?

Thenable 是一个具有 then() 方法的对象。这个 then() 方法与 Promise 中的 then() 方法类似,可以将这个对象作为 Promise 链式调用中的下一个方法。这意味着 Thenable 与 Promise 可以互换使用。

例如:

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

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

Thenable 的使用

在使用 Thenable 时,我们需要确保其 then() 方法具有正确的行为。这意味着 then() 方法需要返回一个新的 Thenable 或一个 Promise 对象。否则,我们就会遇到一个奇怪的行为 – Thenable 对象永远不会被解析。

例如:

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

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

在上述例子中,我们返回了一个字符串,这是不正确的。正确的做法是,then() 方法应该返回一个新的 Thenable 或一个 Promise 对象。

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

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

在上述例子中,我们返回了一个带有 then() 方法的对象。这个 then() 方法返回了一个新的 Thenable 对象,使我们的链式调用有效。

Thenable 的指导意义

理解和正确使用 Thenable 对于深入了解 Promise 的内部运作机制非常重要。在我们协作开发和使用 Promise 库时,可能会遇到各种奇怪的行为。其中,Thenable 可能是其中之一。我们需要学会避免这些问题,并且,我们还需要学会正确地编写 Thenable 对象。

总的来说,我们应该通过以下的步骤来编写正确的 Thenable 对象。

  1. 确认你的 then() 方法应该接收哪些参数;
  2. 在合适的时候调用 resolve() 方法,该方法接收已解决的值;
  3. 在合适的时候调用 reject() 方法,该方法接收拒绝的原因;
  4. 确认你的 then() 方法是否返回一个新的 Thenable 对象或 Promise 对象。

结论

理解 JavaScript Promise 中的 Thenable 对于我们开发和使用 Promise 非常重要。虽然 Thenable 可能会引起一些奇怪的行为,但是当我们正确使用和编写 Thenable 时,它可以为我们带来更强大和灵活的 Promise 功能。我们需要学会正确避免问题,并正确地编写 Thenable 对象,以便它们在 Promise 链中发挥最大的作用。

示例代码

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

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

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

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

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