【问题标题】:How to repeat a message to console using a schedule如何使用计划将消息重复到控制台
【发布时间】:2021-04-04 16:27:47
【问题描述】:

我正在尝试了解计划的工作原理,我只想使用计划向控制台显示一条简单的消息。

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 [错误] _

我正在返回一个具有可抛出错误类型的 Task[String]。如果我将 effectTotal 替换为 effect,那么我不会收到编译错误,但程序只是存在而没有重复单词 hello 一次。

我在这里遗漏了什么概念?

【问题讨论】:

    标签: scala zio


    【解决方案1】:

    首先,你不能在 for-comprehension 的第一行包含 =。您需要将您的纯值包装在 ZIO.succeed 中,或者将其放在易于理解的范围之外。

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

    retry 失败时重试,但effectTotal / succeed 不会失败。你应该改用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)
    }
    

    【讨论】:

    • " 但是,succeed 适用于没有任何副作用的值。如果您知道您的值确实有副作用,请考虑使用 ZIO.effectTotal 以清楚起见。"..来自文档。有没有办法使用 effectTotal 让它工作?
    • 你说的是哪一个?修复了错误的错误代码或实际产生所需结果的底部代码。因为我没有为后者使用任何succeed,而且我还为您提供了一个在 cmets 中使用effectTotal 的替代示例。
    • 感谢您的澄清,不胜感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多