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 对象。
- 确认你的 then() 方法应该接收哪些参数;
- 在合适的时候调用 resolve() 方法,该方法接收已解决的值;
- 在合适的时候调用 reject() 方法,该方法接收拒绝的原因;
- 确认你的 then() 方法是否返回一个新的 Thenable 对象或 Promise 对象。
结论
理解 JavaScript Promise 中的 Thenable 对于我们开发和使用 Promise 非常重要。虽然 Thenable 可能会引起一些奇怪的行为,但是当我们正确使用和编写 Thenable 时,它可以为我们带来更强大和灵活的 Promise 功能。我们需要学会正确避免问题,并正确地编写 Thenable 对象,以便它们在 Promise 链中发挥最大的作用。
示例代码
-- --- -------- --- -------- - - ----- ----------------- ------- - ----------- ---- ------------ ------ ------ -- ------ - -- ----------------------------------------------- - -------------------- -- --------- --- -- --- -------- --- -------- - - ----- ----------------- ------- - ----------- ---- ------------ ------ - ----- ----------------- ------- - -------------------- ----------- ----------------- --------- - - - -- ----------------------------------------------- - -------------------- -- --- ---- ---------- ------------------------ - -------------------- -- -------- ---------- --------- ------- ---
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671f2cd92e7021665efc1dee