Начальная задержка для ZIO ZSchedule - PullRequest
2 голосов
/ 23 октября 2019

Расписание, которое я пытаюсь составить, должно было бы:

  1. Запуск после указанной задержки
  2. Повтор с фиксированной скоростью
  3. Прекращение при достижениизаданный лимит времени или встречает завершающее состояние

Итак, что у меня есть (2.) и (3.):

val repeatUntilTimeLimitReached =
  ZSchedule
    .fixed(config.pollingConfig.pollInterval)
    .untilOutput(pollingTimeLimitReached)

val untilTermination = Schedule.doUntil[RebootState](_.terminatesPolling)

val schedule = repeatUntilTimeLimitReached *> untilTermination                                           

Я пытался ZSchedule.delayed(), но, похоже,добавьте задержку и в последующие расписания.

Так есть ли способ добавить начальную задержку к ZSchedule?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

После небольшого обсуждения с сообществом кажется, что ожидаемое поведение невозможно с Schedule (версия ZIO: 1.0.0-RC15), так как оно используется для повторения после первого выполнения.

В итоге я использовал ZIO.sleep() и schedule, которые я сделал в оригинальном сообщении:

val schedule = repeatUntilTimeLimitReached *> untilTermination       

for {
  _     <- ZIO.sleep(initialDelay)
  state <- doStuff().repeat(schedule)
} yield state
1 голос
/ 23 октября 2019

Почему бы не добавить еще один Расписание и составить их:

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 ()
...