You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:14:07