可取消承诺的状态

Posted

技术标签:

【中文标题】可取消承诺的状态【英文标题】:Status of cancellable promises 【发布时间】:2014-03-13 22:28:41 【问题描述】:

https://github.com/promises-aplus/cancellation-spec 上最早的问题是(在撰写本文时)9 个月大。我真的找不到关于“标准”承诺的取消功能的可靠信息来源。

现在看来,该功能已在 bluebird 中实现,但作为库开发人员,我不想用完整的 Promise 实现来弄乱我的包。

我想做的只是简单地传递一个类似承诺并支持取消规范。

我在哪里可以找到这些信息?

【问题讨论】:

【参考方案1】:

可取消的承诺不会出现在 ES6 中,因为 ES6 的承诺非常少。

Promises/A+ 领域的取消工作已经停滞不前,因为我们正在等待库的演变来证明一种方法明显更胜一筹。最新的想法是this issue,这是大多数希望实现取消的库似乎都遵循的(或多或少)。重点是:

作为拒绝的特殊情况的取消 对取消的反应在链中向上传播,拒绝本身也在向下传播。

不清楚您所说的“简单地传递类似承诺并支持取消规范”是什么意思。您是否正在尝试生成 thenables,假设您的图书馆的消费者会强制转换它,但之后会以某种方式继承一些取消行为?这有点棘手,特别是因为取消通常取决于用于拒绝承诺的指定 Cancellation 构造函数。如果取消生态系统更加发达,那么执行此操作的方法可能会更加直接。

至于未来,嗯,它在不断变化!前进的一条途径是让某人在 Promises/A+ 空间中支持取消提案的演变,从 Q、RSVP、when 和 Bluebird 等主要库中获得实施者的支持。然后很多较小的图书馆可能会购买,并且您可能会依赖一些东西。如果它证明很受欢迎,它可能也会被考虑用于 ECMAScript 承诺!

但这取决于很多人做很多工作,所以我们会看看它是否会发生:)。在基本 Promises/A+ 规范中发生这种情况是一种奇迹,但谁知道呢……它可能会再次发生!

【讨论】:

Domenic,您在承诺规范方面的工作非常出色,感谢您的澄清。是的,我的意思正是如此,能够产生 cancellable thenable 会很棒。怎么会有人更多地参与使这成为现实?有很多粗糙的边缘,例如取消Promise.all 结果和类似的聚合。 @PierPaoloRamon 在可预见的未来,您可以指望 Bluebird 继续支持 Cancellable,但此时它是“选择加入”而不是“选择退出”。也就是说,您必须在 promise 上调用一个方法才能使其可取消。因此,由于作为一个 API,它在最坏的情况下对库没有性能“成本”,它最终将成为一个插件 - 所以你可以继续使用它。也就是说,我可能不会编写依赖于用户意识到/熟悉这种行为的前端(库)代码,因为目前大多数其他库都没有实现它,也没有在本机 JS 中实现。 我不确定这是否是同一件事,也许只是相关,但the TC39 cancelable promises proposal已被撤回。 @Stijn 这是同一个问题。它撤回最近(最后几个小时)关于该主题的动向。 @PierPaoloRamon 我刚刚注意到回答者和提案冠军是同一个人,哎呀:)

以上是关于可取消承诺的状态的主要内容,如果未能解决你的问题,请参考以下文章

检查pthread可取消状态

javascript 带有取消的多个承诺链

在 ReactJS 中卸载组件时取消承诺

javascript 取消承诺链

承诺等待后取消 lodash debounce

vue 表格数据编辑,点击取消或者完成按钮后,关闭编辑状态没有及时生效