我想玩ZIO时间表和重试,但找不到完成的例子。下面的代码(IDEA中的研讨会)怎么样:
import zio._
import zio.duration._
import zio.console._
val r = scala.util.Random
def funcReadFromDb(inp :Int): Task[Seq[Int]]= {
val rnd :Int = r.nextInt(10)
println(s"rnd=$rnd")
//if (rnd <= 5)
Task.succeed(Seq(inp, inp * 2, inp * 3))
//else Task.fail(new Exception("custom exception"))
}
val spaced :zio.Schedule[zio.clock.Clock with Console,Any,Int] = Schedule.spaced(1.second)
val schedEff = for {
s <- funcReadFromDb(3).repeat(spaced)
_ <- putStrLn(s"s=$s")
} yield ()
val runtime = new DefaultRuntime {}
runtime.unsafeRun(schedEff)我希望得到一些间隔为1秒的迭代输出。并输出以下内容:
spaced: zio.Schedule[zio.clock.Clock with zio.console.Console,Any,Int] = zio.Schedule$$anon$18@535bf6e0
rnd=4
schedEff: zio.ZIO[zio.clock.Clock with zio.console.Console,Throwable,Unit] = zio.ZIO$FlatMap@63303dbf
runtime: zio.DefaultRuntime = $anon$1@3e661711发布于 2019-11-22 17:31:07
funcReadFromDb不是纯的。nextInt和println是特效,必须包装到Task body中。
def funcReadFromDb(inp :Int): Task[Seq[Int]]= {
Task.effect {
val rnd: Int = r.nextInt(10)
println(s"rnd=$rnd")
Seq(inp, inp * 2, inp * 3)
}
}https://stackoverflow.com/questions/58987802
复制相似问题