我有一个闭包,其中future
占用do
块。 do块中的每个函数都由闭包的参数提供:
(defn accept-order
[persist record track notify log]
(fn [sponsor order]
(let [datetime (to-timestamp (local-now))
order (merge order {:network_reviewed_at datetime
:workflow_state "unconfirmed"
:sponsor_id (:id sponsor)})]
(future
(do
(persist order
(select-keys order [:network_reviewed_at
:workflow_state
:sponsor_id]))
(record sponsor order true)
(track)
(notify sponsor order)
(log sponsor order)))
order)))
do
块中没有函数被触发。如果我决定未来,那就有效。如果我删除它的未来它是有效的。如果我从REPL运行,它的工作原理。但如果我运行lein test
,它将无效。
有什么想法吗?谢谢!
答案 0 :(得分:4)
在调用函数的测试中添加(Thread/sleep 2000)
会导致未来运行,所以我猜测Leiningen在你的未来运行之前就已经杀了VM(或者至少在它成功运行之前它的副作用)。 Leiningen在运行测试后立即杀死VM。
作为旁注,您不需要do
。 future
占用一个身体,而不是一个表达。