【问题标题】:How do I convert an ApiFuture to a ZIO Task?如何将 ApiFuture 转换为 ZIO 任务?
【发布时间】:2021-09-26 04:20:36
【问题描述】:

我正在使用 Firebase,所以我有很多 ApiFuture<A> 类型的返回类型。我想将它们变成 Task[A] 以使用 ZIO 效果。

【问题讨论】:

    标签: firebase scala zio


    【解决方案1】:

    我们可以创建一个方法来使用 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
    

    【讨论】:

    • 为什么都是开销,直接把扩展方法加到ApiFuture
    猜你喜欢
    • 2020-11-01
    • 2021-07-17
    • 2021-07-21
    • 2020-10-22
    • 1970-01-01
    • 2021-08-04
    • 2020-01-30
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多