Crystal语言是否提供类似JavaScript的Timer/Interval功能?
Crystal 中的 Timer/Interval 实现(类似 JS 的 setTimeout/setInterval)
嘿,这个问题问得好!Crystal 里确实有实现类似 JavaScript 中 setTimeout() 和 setInterval() 的定时功能,只不过不像 JS 那样是全局直接暴露的函数,而是和它的异步纤程(Fiber)以及事件循环体系结合在一起。下面给你详细讲讲几种常用的实现方式:
1. 使用标准库的 Timer 类
Crystal 的标准库提供了 Timer 类,支持一次性定时和重复定时两种模式,直接对应 JS 的 setTimeout 和 setInterval:
模拟 setTimeout(一次性触发)
# 创建一个3秒后执行的定时器 one_shot_timer = Timer.new(3.0) do puts "3秒时间到啦!" end # 启动定时器 one_shot_timer.start # 注意:Crystal 是编译型语言,主线程结束会终止所有任务,所以需要让主线程保持运行 sleep 4.0
模拟 setInterval(重复触发)
只需要给 Timer 加上 recurring: true 参数,就能实现每隔固定时间重复执行:
# 创建一个每隔2秒触发一次的定时器 interval_timer = Timer.new(2.0, recurring: true) do puts "又过了2秒~" end interval_timer.start # 让程序运行10秒后停止定时器 sleep 10.0 interval_timer.stop
2. 用纤程(Fiber)+ sleep 手动封装
如果你觉得 Timer 类的写法不够直观,也可以利用 Crystal 的纤程特性,手动封装出类似 JS 的全局函数:
# 封装 setTimeout:延迟指定秒数后执行一次 def set_timeout(delay : Float64, &block : ->) spawn do sleep delay block.call end end # 封装 setInterval:每隔指定秒数重复执行 def set_interval(interval : Float64, &block : ->) spawn do loop do block.call sleep interval end end end # 调用示例 set_timeout(3.0) { puts "3秒后触发的一次性任务" } set_interval(2.0) { puts "每2秒触发一次的重复任务" } # 保持主线程存活 sleep 10.0
注意事项
- Crystal 的定时任务依赖于纤程和事件循环,所以必须确保主线程不会提前退出(比如用
sleep、Channel或者其他方式阻塞主线程)。 - 如果你之前查文档没找到,可能是因为这些功能没有放在
Time类里,而是属于 Crystal 的异步运行时模块,需要结合纤程或Timer类来使用。
内容的提问来源于stack exchange,提问作者dkimot
相关产品推荐
相关产品推荐

