代码之家  ›  专栏  ›  技术社区  ›  Blankman

如何使用日程表向控制台重复消息

  •  0
  • Blankman  · 技术社区  · 3 年前

    我正在尝试了解日程表是如何工作的,我只是想使用日程表向控制台显示一条简单的消息。

    import zio.console._
    import zio._
    import scala.util.Try
    import zio.duration._
    import zio.clock._
    
    object MyApp extends zio.App {
    
      def run(args: List[String]) =
        myAppLogic.exitCode
    
      val myAppLogic =
        for {
          sequential = Schedule.recurs(10) andThen Schedule.spaced(1.second)
          _ <-  ZIO.effectTotal{ "hello" }.retry(sequential)
        } yield ()
    
    }
    

    我遇到了这个错误:

    此错误处理操作假定您的效果可能失败。然而, 您的效果对错误类型没有任何影响,这意味着它不能 失败,所以没有必要处理失败。找出哪一个 您可以使用的方法代替此操作,请参阅参考 图表位于: https://zio.dev/docs/can_fail [错误]_<- ZIO.effectTotal{“你好”}重试(顺序)

    我返回了一个Task[String],它具有可抛出的错误类型。如果我用effect替换effectTotal,那么我就不会遇到编译错误,但程序只是存在,甚至没有重复一次hello这个词。

    我在这里错过了什么概念?

    0 回复  |  直到 3 年前
        1
  •  1
  •   yangzai    3 年前

    首先,你不能拥有 = a的第一行是为了便于理解。你需要把你的纯粹价值包裹起来 ZIO.succeed 或者把它放在理解之外。

    “Hello”是一个纯字符串。您可以使用 ZIO.effectTotal 但从技术上讲,它不会产生任何副作用,所以你也应该使用 succeed 在这里。

    retry 失败时重试,但 effectTotal / 成功 不能失败。您应该使用 repeat 相反。

    import zio._
    import zio.duration._
    
    object MyApp extends zio.App {
      def run(args: List[String]) =
        myAppLogic.exitCode
    
      val myAppLogic =
        for {
          sequential <- ZIO.succeed(Schedule.recurs(10) andThen Schedule.spaced(1.second))
          _ <-  ZIO.succeed("hello").repeat(sequential)
        } yield ()
    }
    

    现在,修复了错误后,它仍然不会显示您的文本,因为您只是在生成值(不是副作用)而没有打印它们(副作用)。

    正确的代码应该是这样的:

    import zio._
    import zio.duration._
    import zio.console._
    
    object MyApp extends zio.App {
      def run(args: List[String]) =
        myAppLogic.exitCode
    
      //leave this out of the for-comprehension
      val sequential = Schedule.recurs(10) andThen Schedule.spaced(1.second)
    
      val myAppLogic = putStrLn("hello").repeat(sequential)
    
    //  Or you could suspend the `println` side effect with `effectTotal` (doesn't fail but produces side effects)
    //  val myAppLogicAlt = ZIO.effectTotal(println("hello")).repeat(sequential)
    }
    
    推荐文章