如何在Clojure中链接承诺

时间:2013-01-30 02:25:44

标签: clojure

在Scala中,您可以使用mapflatMap来运行未来成功结果的函数。

val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)

是否有比这更好的Clojure类似物:

(def x (promise))
(def y (future (str @x)))

在等待x的送达时,上面阻止了一个帖子?

1 个答案:

答案 0 :(得分:2)

在尝试dref y值

之前,你的clojure代码不会阻塞
(def x (promise)) ;wont block
(def y (future (str @x)))  ;wont block
(print @y) ;will block

就类比而言,代码看起来很好。但是如果你想要某种更具声明性的链接期货方式,这在概念上是减少的,那么你可以使用reduce,如下所示:

(def x (promise))
(def final (reduce #(future (%2 @%1)) 
                   x 
                   [inc dec (partial + 10) str]))

(deliver x 10)
@final => "20"

你甚至可以提出一个类似于线程->, ->>宏但为每个线程表达式创建未来的宏,但我认为当你使用普通函数执行此操作时,这将是一种过度杀伤。