如何使承诺因clojure中的错误而失败?

Posted

技术标签:

【中文标题】如何使承诺因clojure中的错误而失败?【英文标题】:How to make promise fail with an error in clojure? 【发布时间】:2020-02-10 04:02:49 【问题描述】:

我正在尝试在 clojure 中了解 Promise。从文档中,我可以看到我们可以使用 promise 函数创建承诺:

(def p (promise))

我们可以使用deliver这样的函数来解决它

(deliver p 42)

我想了解,我们如何拒绝带有错误或异常的承诺。我已经尝试过文档,但似乎没有帮助。我是函数式编程的新手,我想知道对于失败的 Promise 可能有不同的方法。

【问题讨论】:

你不能只传递一个表示错误的对象吗? (deliver p :error "Couldn't connect", :other-info "Some info")。你追求什么行为? 这就是我最终所做的。我正在将 clojure 的承诺与 javascript 的承诺进行比较,当你拒绝一个承诺时,它会调用代表错误的 catch 块。但这里的promise result 被定制为表示错误或异常 很难比较两种语言的 Promise。 Javascript 老实说功能更丰富。 Clojure 的 promise 基本上只是一个可变容器,可以只接收一次值。如果您查看它的 source,它实际上只是 atom 的包装,其中包含一些协调。 【参考方案1】:

您可以使用 fail 函数来拒绝一个承诺。

更多详情请参考this链接。

【讨论】:

虽然您链接的设计文档描述了 fail,但截至 1.10.1 版,它并未在 clojure.core 中实现。 这是一个尚未实施的提案。 fail 应该是 IDeliver 协议的一部分,但该协议尚不存在。

以上是关于如何使承诺因clojure中的错误而失败?的主要内容,如果未能解决你的问题,请参考以下文章

Clojure 发布年度调查报告:用于开发企业软件的比例历史最高

NZLOAD 正在工作,而 Netezza 中的外部表因错误输入行数达到最大错误而失败

角度动画因不透明度​​设置而失败(以及更多错误)

故事书因反应中的 eslint 错误而失败

文档中的 Dojo 示例因“id is already registered”错误而失败

连接多个设备时如何使用 ADB Shell?因“错误:多个设备和模拟器”而失败