5

说如果我想在 http4s 之类的东西中使用 ReactiveMongo 是否正确,我将不得不将 ReactiveMongo 返回的所有 Future 调用包装在 Cats IO 效果中?

概括地说,将 ReactiveMongo 合并到 http4s 中需要哪些步骤?

4

1 回答 1

5

Cats Effect 提供了Async类型类,可以让您将一些回调(例如 Future 的onComplete)转换为F. 文档中的一个示例

import cats.effect.{IO, Async}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

val apiCall = Future.successful("I come from the Future!")

val ioa: IO[String] =
  Async[IO].async { cb =>
    import scala.util.{Failure, Success}

    apiCall.onComplete {
      case Success(value) => cb(Right(value))
      case Failure(error) => cb(Left(error))
    }
 }

ioa.unsafeRunSync()

实际上,Async[F]evan 有一个方法允许将 Future 提升到异步:(Async[F].fromFuture(Sync[F].defer(future))Future包裹在 IO 中,因为它的创建是有副作用的,并且会触发急切的计算)。

但是,如果您固定在cats.effect.IO专门使用,则可以简单地使用IO.fromFuture(IO(future)).

您必须在需要将 Future 转换为 IO(或其他 F)的任何地方使用这个(或一些委托给这个的实用程序)。

于 2020-07-14T07:46:41.233 回答