【发布时间】:2015-10-28 05:37:43
【问题描述】:
在 Scala 中,future 可能会失败,这可以异步发现:
f onComplete {
case Success(_) => println("Great!")
case Failure(t) => println("An error has occurred: " + t.getMessage)
}
您如何将其“翻译”成 Clojure?我的阅读使我相信 Clojure 的未来/承诺模型不如 Scala 强大,而且你不能像这样抓住失败。那么该怎么做呢?
永远不需要询问 Scala 未来的价值——当它良好并准备好时,它会告诉你发生了什么(包括它是否失败——这就是这个问题的症结所在)。这就是我所说的“异步”。 Scala 未来可以处于三种可能的状态之一 - 未完成、失败完成、成功完成。
Scala 中的一个典型用例示例是返回 Future[T] 的远程调用,其中 T 是您真正想要返回的类型。如果远程 JVM 关闭,那么在超时后case Failure(t) 将会发生。
这是一个非常简单的模型。在这个问题中,我要求一个简单的替代方案。作为附带评论,很高兴听到 Clojure 打算在某个时候采用 Scala Futures 模型。
【问题讨论】:
-
我的理解是期货在 Clojure 中不是很常用。我看到很多人在谈论
core.async,但我可能错了。 -
futures、core.async、agents 和常规 java 线程池都有自己的位置,它们都不能很好地替代其他线程池
-
@mfirry 我明白为什么他们会被避免。对未来进行“获得价值”是没有意义的。我只是想找出经验丰富的 Clojure 开发人员实际使用的简单替代方案。例如,Om 处理失败时客户端状态的回滚,因此 Om 如何将失败引入我们的代码将给我一个提示。我才刚刚开始研究 Clojure,所以我自己也不知道答案。