关闭未开火的未来(Clojure)

时间:2013-07-13 04:29:49

标签: clojure

我有一个闭包,其中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,它将无效。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

在调用函数的测试中添加(Thread/sleep 2000)会导致未来运行,所以我猜测Leiningen在你的未来运行之前就已经杀了VM(或者至少在它成功运行之前它的副作用)。 Leiningen在运行测试后立即杀死VM。

作为旁注,您不需要dofuture占用一个身体,而不是一个表达。