2

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

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

有没有比这更好的 Clojure 类似物:

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

上面的线程在等待交付时不会阻塞x吗?

4

1 回答 1

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"

你甚至可以想出一个类似于线程->, ->>宏但为每个线程表达式创建期货的宏,但我认为如果你可以使用普通函数来做到这一点,那将是一种矫枉过正。

于 2013-01-30T10:41:03.750 回答