2

a がブロックfutureを取るクロージャーがあります。dodo ブロック内の各関数は、クロージャの引数によって提供されます。

(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すると機能しません。

何か案は?ありがとうございました!

4

1 に答える 1

4

関数を呼び出すテストに a を追加する(Thread/sleep 2000)と、future が実行されるため、future が実行される前に (または少なくとも副作用が発生する前に) Leiningen が VM を強制終了していると思います。Leiningen は、テストを実行した直後に VM を強制終了します。

補足として、必要はありませんdofuture単一の式ではなく、本体を取ります。

于 2013-07-13T04:54:13.407 に答える