【问题标题】:Custom thenables: Can I create my own objects with a "then" method?自定义 thenables:我可以使用“then”方法创建自己的对象吗?
【发布时间】:2017-11-08 22:15:42
【问题描述】:

我想知道自定义“thenables”(又名具有.then() 方法的对象)是否被批准/记录?它们与真正的 Promise 相比如何?我想这很重要你如何实现,所以我想知道是否有一些 DO 和 DONT 的文档。

This page 建议:

.then 可能会返回一个任意的“thenable”对象,它会被视为一个 Promise。

找不到关于此的任何文档。

【问题讨论】:

  • I suppose it matters how you implement then 确实如此 - 至于文档......也许是“规范”中的 .then 描述promisesaplus.com
  • 我必须研究那个链接,谢谢。我希望找到一些更详尽的示例来说明如何实现您自己的自定义 thenables。
  • 不确定您所说的“已批准”是什么意思?
  • 即使自定义 .then-able 在某些情况下有效,但在其他情况下可能会失败,例如,如果它不是“真正的”承诺。这就是为什么我想知道自定义 thenables 是“最佳实践”还是预期的功能。我认为创建自定义 .then-ables 具有很大的潜力,并且会有很多人这样做。并且会有特定的模式/反模式。
  • @MikeLewis 您认为简单地创建“真实”承诺没有涵盖哪些潜力?

标签: javascript promise async-await


【解决方案1】:

thenables 与真正的 Promise 相比如何?

因为你不知道它们是否是真正的承诺。看看Regarding Promises/A+ Specification, what is the difference between the terms "thenable" and "promise"?

我想知道是否有一些关于如何实施它们的 DO 和 DONT 的文档(因为这似乎很重要)

有(非常简单的)Promises/A+ specification 记录了 thenables 的处理方式。 ES6 承诺(以及扩展,await)遵循这一点。基本上:

  • 您的对象有一个名为 then 的属性,其值为函数
  • 函数将通过两个回调调用
  • 您可以调用其中任何一个 - 异步或不异步
  • 第一次调用决定了同化你的 thenable 的 Promise 会发生什么

这真的没有魔法。当你想用一个值解析时调用第一个参数,当你想拒绝时调用第二个参数。假设有正确的 Promise 实现,没有 DONTs - 您可以根据需要随时调用回调,并根据需要保留它们:应该忽略调用并且引用不应泄漏内存。

【讨论】:

  • 最后一部分似乎有点不靠谱。所以我等待我的自定义 thenable,可能在一个循环或其他东西中。每秒可能有 1000 次(我没有真正的用例,只是这里的假设),每次,它都会给我一个新的 cb。如果我使用典型的回调模式(函数数组),那么我将存储 1000 个回调,每次我的 streamy.thenable 发出数据时调用 all 的回调......?跨度>
  • 你是说,我再调用那些已经调用的回调也没关系,它应该不会有任何伤害。但是,如果他们有很多......这似乎不是一个好主意。
  • @MikeLewis 实际上循环中的await 将暂停循环,直到值被解析:-) 是的,堆积回调不是一个好主意。当然,做很多无用的操作,把无用的东西保存在内存中还是很痛苦的;我要说的是它不会影响用 thenable 解决的承诺。
  • 链接呢?自定义 thenable 的 .then() 方法应该返回一个新的 thenable,带有 .then() 方法,它以某种方式链接到传递给第一个的函数的返回值。我认为?不确定这如何适用于可重复的 thenables(如事件/流)
  • 没有。 then() 的返回值在被 promise(或 await)同化时被丢弃。仅当您想自己使用 thenables 时,链接才重要 - 但实际上没有充分的理由不使用适当的 Promise。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2021-02-14
  • 2019-01-08
  • 2011-05-16
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多