firebase - 如何将 ApiFuture 转换为 ZIO 任务?
问题描述
我正在使用 Firebase,所以我有很多 type 的返回类型ApiFuture<A>
。我想把它们变成一个Task[A]
与 ZIO 效果一起工作的东西。
解决方案
我们可以创建一个方法来使用 Typeclasses 转换所有这些:
trait EffectUtils[F[_]] {
def toEffect[A](a: F[A]): Task[A]
}
object EffectUtils {
implicit val apiFuture: EffectUtils[ApiFuture] = new EffectUtils[ApiFuture] {
override def toEffect[A](a: ApiFuture[A]): Task[A] = Task.effectAsync[A]( cb =>
ApiFutures.addCallback(a, new ApiFutureCallback[A] {
override def onFailure(t: Throwable): Unit = cb(Task.fail(t))
override def onSuccess(result: A): Unit = cb(Task.succeed(result))
})
)
}
implicit class ApiFutureOps[A](f: ApiFuture[A]) {
def toEffect(implicit instance: EffectUtils[ApiFuture]) = instance.toEffect(f)
}
}
现在,当我们发出 API 请求并希望将结果转换为 ZIO 类型时,这很容易:
import EffectUtils._
object App {
// calling a Firebase function
val record: Task[UserRecord] = firebase.getInstance().auth().getUserByEmailAsync(email).toEffect
推荐阅读
- microservices - RestTemplate getForEntity 方法 405 错误
- shader - 像素着色器中 SV_POSITION 的 z 分量
- node.js - 使用 express 在节点之间发送时缺少一些二进制数据字节
- c# - 如何调试使用 p/invoke 调用的本机代码
- c++ - 如果双端队列不够大,为什么通过 std::copy 成功将 std::deque 对象附加到自身?
- android - 我的 webview 应用程序在另一个应用程序之上打开
- python - 从多个数据帧中提取数据
- asterisk - 没有应用程序“AGI”进行扩展
- angular - Auth Guard 即使在登录后也无法正常工作,总是重定向到登录页面
- unity3d - 我将如何在另一个游戏对象顶部的某个地方获得一个随机位置的 vector3?