可取消的 Promise 的状态

15

在撰写本文时,https://github.com/promises-aplus/cancellation-spec 上最老的问题已经存在了九个月。我真的找不到关于“标准”承诺取消功能的可靠信息来源。

目前看来,这个特性已经在bluebird中实现,但作为一个库开发人员,我不想用完整的 promise 实现来弄乱我的包。

我想做的就是简单地传递一个类 promise 的对象并支持取消规范。

我该在哪里找到这些信息呢?

1个回答

18

可取消的Promise不会出现在ES6中,因为ES6的Promise非常简单。

在Promises/A+空间中关于取消的工作已经停滞不前,因为我们正在等待库的发展证明一种方法明显优越。最新的想法在这个问题中,这是大多数寻求实现取消的库所遵循的(或多或少)。其关键点如下:

  • 取消作为拒绝的特殊情况。
  • 对取消的反应向上传播到链中,就像拒绝本身向下传播一样。

“只需传递类似于Promise的并支持取消规范”是什么意思还不清楚。您是否试图生成thenable,假设您的库的使用者将其转换,但后来继承了某些取消行为?这可能有点棘手,尤其是因为取消通常取决于用于拒绝Promise的指定Cancellation构造函数。如果取消生态系统更加完善,解决此问题的方法可能会更加直接。

至于未来,嗯,它仍在变化中!前进的路线之一是有人在Promises/A+空间中主导取消提案的发展,获得Q、RSVP、when和Bluebird等主要库的实施者认可。然后许多较小的库可能会加入,您可能会得到一些您可以依赖的东西。如果它被证明很受欢迎,那么它很可能会被考虑用于ECMAScript Promise!

但这取决于很多人做了很多工作,所以我们将看看它是否会发生:)。基于Promises/A+规范的基础就已经是一个奇迹,但谁知道……它可能会再次发生!


1
Domenic,你在Promise规范上的工作真是太棒了,感谢你的澄清。而且我确实是指这个,能够生成可取消的thenable将会非常棒。有什么方法可以让更多人参与进来,使之成为现实呢?例如,像Promise.all结果的取消等聚合操作还存在很多问题。 - Pier Paolo Ramon
1
@PierPaoloRamon,您可以放心地依赖Bluebird在可预见的未来继续支持Cancellable,但目前它是“选择加入”而不是“选择退出”。也就是说,您必须调用承诺上的方法才能使其可取消。因此,由于作为API对库没有性能“成本”,最坏的情况下它最终将成为插件 - 因此您可以继续使用它。尽管如此,我可能不会编写依赖用户了解/熟悉此行为的前端代码(库),因为大多数其他库和原生JS都没有实现它。 - Benjamin Gruenbaum
1
我不确定这是否与同一件事有关,也许只是相关的,但是TC39可取消的Promise提案已被撤回。 - user247702
1
@Stijn 这是同样的问题。它已经被撤回,但最近几个小时内该主题有了非常新的进展。 - Pier Paolo Ramon
@PierPaoloRamon 我才注意到回答者和提案冠军是同一个人,糟糕 :) - user247702

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接