Scala-如何从Hammock的IO [HttpResponse]中获取数据?

问题描述 投票:0回答:1

我有一个简单的方法:

def retrieveRepositories(url: String, params: String): IO[HttpResponse] = Hammock.getWithOpts(uri"$url", createOpts).exec[IO]

哪个是http客户端。和json解码器:

implicit def decodeResponseEntity(response: HttpResponse): Either[CodecException, List[GitRepository]] = Decoder[List[GitRepository]].decode(response.entity)

现在我要这样称呼此客户:

def getRepos(organization: String, params: String): F[Either[CodecException, List[GitRepository]]] = for {
    res <- retrieveRepositories(organization, params)
    result <- Sync[F].delay(decodeResponseEntity(res))
  } yield result

但是,result <- Sync[F].delay(decodeResponseEntity(res))行有问题,因为我收到一个错误:Type mismatch. Reguired: IO[B_] but found F[Either[CodecException, List[GitRepository]]]。当我将unsafeRunSync()方法添加到retrieveRepositories(organization, params)时,它可以正常工作,但是我应该在最后而不是此处调用此方法。我应该如何解决?

scala scala-cats hammock
1个回答
0
投票

如果可能,您可能想要更改retrieveRepositories的定义并根据效果类型(F)进行参数化,而不是使用具体的IO类型。

如果无法更改retrieveRepositories,请在LiftIO中添加一个隐式getRepos约束。您将可以使用liftIO方法将具体的IO值提升为F。另一种选择是使用Async类型类,该类同时继承自SyncLiftIO

请参阅liftIO的文档:https://typelevel.org/cats-effect/typeclasses/liftio.html

© www.soinside.com 2019 - 2024. All rights reserved.