在 Scala 中,您可以使用 map
和 flatMap
在 future 的成功结果上运行函数。
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
是否有比以下更好的 Clojure 类似物:
(def x (promise))
(def y (future (str @x)))
上面的代码在等待 x
传递时不会阻塞线程吗?
最佳答案
在您尝试 dref y 的值之前,您的 clojure 代码不会阻塞,即
(def x (promise)) ;wont block
(def y (future (str @x))) ;wont block
(print @y) ;will block
就类比而言,代码看起来不错。但是,如果您想要某种更具声明性的链接 future 的方式(概念上是归约),那么您可以使用 reduce
,如下所示:
(def x (promise))
(def final (reduce #(future (%2 @%1))
x
[inc dec (partial + 10) str]))
(deliver x 10)
@final => "20"
您甚至可以想出一个类似于线程 ->, ->>
宏的宏,但为每个线程表达式创建 future,但我认为当您可以时,这将是一种矫枉过正使用正常功能执行此操作。
关于clojure - 如何在 Clojure 中链接 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595674/