在Clojure中,promise
个对象实现了clojure.lang.IFn
,并且用单个参数调用promise即可实现promise。这就是实现deliver
的方式: [source]
(defn deliver
"Delivers the supplied value to the promise, releasing any pending
derefs. A subsequent call to deliver on a promise will have no effect."
{:added "1.1"
:static true}
[promise val] (promise val))
如果(deliver x y)
只是对(x y)
的间接访问,为什么还要使用deliver
?
我假设这应该以某种方式帮助消除功能中的诺言-但相同的论点可能适用于使用某些特定于诺言的功能来读取诺言,而不是使用通用的deref
函数那个。
答案 0 :(得分:4)
使这样的代码看起来不错是一种语法糖:
(-> url
download
extract-value
(deliver consumer)
过去,deliver函数具有确保您在第二个调用者处出现异常的行为。它在2011年进行了更改,现在以后的调用将被忽略。
如果作为函数调用,则承诺始终具有相同的行为;如果从交付调用,则函数交付只能填补使某些东西看起来有些不同的工作量。如今,T仍然会使用它与我未来的自我沟通
答案 1 :(得分:1)
deref
比函数调用机制通用性低得多。当您看到被取消引用的内容时,您就知道它正在从某个地方获取一些价值。当您看到(f x)
时,如果您不知道f
是什么,您真的不知道发生了什么:它什么也做不了。 deliver
为您提供了更多背景信息。