2024 年 Clojure 状况调查中分享您的看法!

欢迎!请查看 关于 页面以了解更多有关如何使用本功能的信息。

0
Clojure

报警函数

简单描述

报警函数是一个特性,每隔一段时间会调用一个函数。


使用

(defn function
  "This function will be called every 1 minute 10 times"
  []
  (println "Hello, world!"))

 (defn -main 
  ""
  [& args]
  (alarm 1 10 function))

简单用例

当一个用户创建账户但未确认电子邮件时,通过报警来验证用户是否真的未确认。

1 答案

+1

Josue,看看Java的Timers
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Timer.html

使用Clojure也可以有很多方法来做这件事:使用future、agents或者core.async。

将这个放入clojure.core会带来不必要的复杂性和维护成本。

还有一些设计选择,比如,它将在线程池上运行吗?它会等待任务终止后才开始计数超时吗?它可以阻塞吗?

根据您选择的哪组选项,将使得将该功能移植到其他(future)平台变得更加困难:javascript不支持阻塞,arduino没有系统时钟...

所以,您可以随心所欲地创建自己的josue.timer API或使用一些已经存在的API

这里有一段使用java timers的代码

(let [every-5-sec (java.time.Duration/parse "PT5S")
      ok-task (proxy [java.util.TimerTask] []
                (run []
                  (prn :ok)))
      ;; save this return for later
      timer-task (doto (java.util.Timer.)
                   (.schedule ok-task
                     (.toMillis every-5-sec)
                     (.toMillis every-5-sec)))]
  #_(.cancel ok-task)
  #_(.cancel timer-task)
  timer-task)
...