Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭中的未来不开火(Clojure)_Clojure - Fatal编程技术网

关闭中的未来不开火(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问题:,但我没有使用任何序列(我不认为)。这太神奇了。你成功了,太棒了。你搞定了。