我创建了我的服务的两个版本。第一个使用Futures,另一个使用ZIO作为特效。
我有一个简单的方法,它使用Future作为结果效果:
def get(id: String)(implicit executionContext: ExecutionContext): Future[Data]我还有其他一些使用ZIO[SomeEnv, SomeError, Data]的版本
def get(id: String): ZIO[SomeEnv, SomeError, Data]现在,我需要创建某种类型的适配器,它将从一个或另一个版本返回数据:
def returnDataFromServiceVersion(version: Int) : ??? = {
if(version == 1) futureService.get(...)
else zioService.get(...)
}这里的问题是返回类型。我不知道如何将ZIO转换为future或将Future转换为ZIO以具有通用返回类型。我尝试使用ZIO.fromFuture{...}或toFuture(),但没有帮助。我的问题是-如何创建这个returnDataFromServiceVersion方法来同时使用这两个服务?我需要在这里有一个通用的返回类型。
或者也许有另一种方法来解决这个问题?
发布于 2020-07-01 22:26:36
您必须决定您的函数返回的是Future还是ZIO,这不能依赖于代码片段中的运行时值,如version (当然,除非您将返回类型定义为AnyRef -这不是很有用)。
如果程序的其余部分是基于Future的,但您想要在某些服务中引入ZIO,则可以通过使用runtime.unsafeRun(effect)自己执行效果来实现这一点。
val runtime = Runtime.default
def returnDataFromServiceVersion(version: Int): Future[Data] = {
runtime.unsafeRunToFuture(
zioService.get(...)
)
}有关更多详细信息,请参阅官方ZIO文档中的Running Effects。
发布于 2020-07-01 22:22:27
如果我没理解错的话,您想要的是像下面这样的ZIO[SomeEnv, SomeError, Data]的通用ZIO类型
这可以通过使用ZIO.fromFuture并将Throwable ( Future故障类型)映射到您的SomeError来实现
case class Data(data: String)
case class SomeEnv(env: String)
case class SomeError(err: String)
object SomeError {
def fromThrowable(throwable: Throwable) = SomeError(throwable.toString)
}
def getFuture(id: String)(implicit executionContext: ExecutionContext): Future[Data] = ???
def getZIO(id: String): ZIO[SomeEnv, SomeError, Data] = ???
def returnDataFromServiceVersion(version: Int): ZIO[SomeEnv, SomeError, Data] =
if (version == 1)
ZIO
.fromFuture(executionContext => getFuture("id")(executionContext))
.mapError(SomeError.fromThrowable)
else
getZIO("id")https://stackoverflow.com/questions/62678605
复制相似问题