我正在嘗試使用他們簡單的 hello world 示例來玩弄 ZIO http。我有一個 Java 撰寫的服務,它執行一些邏輯,并且它需要一個處理程式函式,因此它可以在結果準備好時呼叫它。如何與 ZIO http 一起使用?我想要這樣的東西:
object HelloWorld extends App {
def app(service: JavaService) = Http.collect[Request] {
case Method.GET -> Root / "text" => {
service.doSomeStuffWIthCallback((s:String) => Response.text(s))
}
}
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] =
Server.start(8090, app(new JavaService)).exitCode
}
基本上我想從回呼函式發送 ZIO HTTP 回應,我只是不知道如何去做。謝謝。
編輯:
我無法從您的代碼中獲得正確的型別,因此我決定簡化整個程序,并得出以下結論:
val content: HttpData[Blocking, Throwable] = HttpData.fromStream {
ZStream.fromEffect(doSomeStuffWrapped)
}
def doSomeStuffWrapped = {
UIO.effectAsync[String] { cb =>
cb(
IO.succeed("TEST STRING")
)
}
}
但是,這里的問題是型別不匹配,HttpData.fromStream 需要位元組的 ZStream
這是我的要點的鏈接:https : //gist.github.com/pmkyl/a37ff8b49e013c4e2e6f8ab5ad83e258
uj5u.com熱心網友回復:
您應該使用以下方法將帶有回呼的 Java 服務包裝在效果中effectAsync:
def doSomeStuffWrapped(service: JavaService): Task[String] = {
IO.effectAsync[Throwable, String] { cb =>
service.doSomeStuffWithCallback((s: String) => {
// Success case
cb(IO.succeed(s))
// Optional error case?
// cb(IO.fail(someException))
})
}
}
def app(service: JavaService) = Http.collectM[Request] {
case Method.GET -> Root / "text" => {
doSomeStuffWrapped(service)
.fold(err => {
// Handle errors in some way
Response.text("An error occured")
}, successStr => {
Response.text(successStr)
})
}
}
您可能希望看到這篇文章介紹了在 ZIO 中包裝不純代碼的不同選項:https ://medium.com/@ghostdogpr/wrapping-impure-code-with-zio-9265c219e2e
uj5u.com熱心網友回復:
這也是實作相同結果的另一種方法:
case class MyService(name: String) {
def imDone[R, E](s: String => Unit): Unit = s(name)
}
val s: MyService = MyService("test")
val app: Http[Any, Nothing, Request, UResponse] = Http.collectM[Request] { case Method.GET -> Root / "text" =>
ZIO.effectAsync[Any, Nothing, UResponse] { cb =>
s.imDone { b =>
cb(IO.succeed(Response.text(b)))
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358559.html
