调用 rpc 方法之间的功能

Functionalities between calling rpc methods

我试图改变 ZIO 的 example code 以适应我想要的,但是 运行 遇到了问题。我想在不同的 rpc 调用之间实现功能,但我似乎无法让它工作,因为在下面的示例中,只有 while 循环、rcpMethod3()rcpMethod4() 被执行,而 rcpMethod1()rcpMethod2() 没有。

我想执行所有 rcpMethod 和 while 循环。

object Client extends App {
  val clientLayer: Layer[Throwable, ClientZLayer] =
  ClientZLayer.live(
    ZManagedChannel(
      ManagedChannelBuilder.forAddress("localhost", 8980).usePlaintext()
    )
  )
  
  // rcp methods
  def rcpMethod1(): ZIO[ClientZLayer with Console, Status, Unit] = {
    for {
      response <- ClientZLayer.rcpMethod1(Greeting("Hi"))
      _ <- putStrLn(s"""Greeted: "${response.name}".""")
    } yield ()
  }
  
  // Run the code
  final def run(args: List[String]) = {
    (for {
      _ <- rcpMethod1()
      _ <- rcpMethod2()
    } yield ()).provideCustomLayer(clientLayer).exitCode

    while(condition) {
      // bla bla
    }
  
    (for {
      _ <- rcpMethod3()
      _ <- rcpMethod4()
    } yield ()).provideCustomLayer(clientLayer).exitCode
  }
}

ZIO 数据类型是函数效果。功能效果是对工作流程的描述。这就是为什么我们在世界尽头有 run 方法。此 运行 方法执行提供的 ZIO 效果。

所有rcpMethodN方法都是ZIO效果,所以它们只是对运行ning工作流程的描述。如果您想按顺序 运行 这些效果,您应该使用 for-comprehensionflatMap 组合它们,如下所示:

for {
  _ <- rcpMethod1()
  _ <- rcpMethod2()
  _ <- rcpMethod3()
  _ <- rcpMethod4()
} yield ()

while(condition){ ... } 是您代码中的另一个错误。您应该使用 ZIO 数据类型引入这些循环结构。例如:

for {
  _ <- rcpMethod1()
  _ <- rcpMethod2()
  _ <- ZIO.effect(???).repeatWhile(condition)
  _ <- rcpMethod3()
  _ <- rcpMethod4()
} yield ()