关闭中的未来不开火(Clojure)
我有一个闭包,其中一个关闭中的未来不开火(Clojure),clojure,Clojure,我有一个闭包,其中一个未来接受一个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
未来
接受一个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
,它将不起作用
有什么想法吗?谢谢大家! 在调用函数的测试中添加一个(Thread/sleep 2000)
会导致future运行,因此我大胆猜测,Leiningen正在您的future运行之前(或者至少在它设法造成副作用之前)杀死VM。Leiningen确实会在运行测试后立即杀死VM
作为旁注,您不需要do
future
需要一个主体,而不是一个表达式。在调用函数的测试中添加一个(Thread/sleep 2000)
会导致future运行,所以我大胆猜测Leiningen是在future运行之前(或者至少在它设法产生副作用之前)杀死VM。Leiningen确实会在运行测试后立即杀死VM
作为旁注,您不需要
do
future
采用一个主体,而不是一个表达式。请添加一些有关测试设置的详细信息。lein test
文档指出:$lein test[TESTS]#在测试名称空间中运行测试,或运行所有测试。也许leiningen没有检测到任何测试,您的accept order函数没有被调用,您的未来也没有被调用?这是我最初的“黑暗中射击”猜测。谢谢你这么快的回复。它肯定被调用了。事实上,测试通过了。但副作用(电子邮件、谷歌分析事件、日志记录)不会激发。奇怪的是,代码在从Compojure调用时执行。这里有一个类似的SO问题:,但我没有使用任何序列(我不认为)。请添加一些关于如何设置测试的详细信息。lein test
文档指出:$lein test[TESTS]#在测试名称空间中运行测试,或运行所有测试。也许leiningen没有检测到任何测试,您的accept order函数没有被调用,您的未来也没有被调用?这是我最初的“黑暗中射击”猜测。谢谢你这么快的回复。它肯定被调用了。事实上,测试通过了。但副作用(电子邮件、谷歌分析事件、日志记录)不会激发。奇怪的是,代码在从Compojure调用时执行。这里有一个类似的SO问题:,但我没有使用任何序列(我不认为)。这太神奇了。你成功了,太棒了。你搞定了。