我试图制定的时间表必须:
- 在指定的延迟后启动
- 以固定速率重复
- 如果达到给定的时间限制或遇到终止状态,则终止
所以我有的是(2.)和(3.):
val repeatUntilTimeLimitReached =
ZSchedule
.fixed(config.pollingConfig.pollInterval)
.untilOutput(pollingTimeLimitReached)
val untilTermination = Schedule.doUntil[RebootState](_.terminatesPolling)
val schedule = repeatUntilTimeLimitReached *> untilTermination
我尝试了ZSchedule.delayed()
,但它似乎也增加了后续时间表的延迟。
那么有没有办法将初始延迟添加到ZSchedule
?
在与社区进行了一次小型讨论后,似乎使用Schedule
(ZIO 版本:1.0.0-RC15)无法实现预期的行为,因为它用于在第一次执行后重复。
我最终使用了我在原始帖子中所做的ZIO.sleep()
和schedule
:
val schedule = repeatUntilTimeLimitReached *> untilTermination
for {
_ <- ZIO.sleep(initialDelay)
state <- doStuff().repeat(schedule)
} yield state
为什么不添加另一个时间表并编写它们:
val delayedSchedule = Schedule.once.delayed(_ + 12.seconds)
val schedule = delayedSchedule *> repeatUntilTimeLimitReached *> untilTermination
我玩了一下这个,你需要flatMap
时间表。
在这里,我使用一个使用zio.console
的示例:
import zio.console._
import zio.duration._
import zio.{App, Schedule, ZIO}
val s = Schedule.spaced(1.second)
for {
_ <- putStrLn("Start")
_ <- putStrLn("Initial Delay").delay(5.seconds)
_ <- putStrLn("Repeated Delay").repeat(s)
} yield ()