说如果我想在 http4s 之类的东西中使用 ReactiveMongo 是否正确,我将不得不将 ReactiveMongo 返回的所有 Future 调用包装在 Cats IO 效果中?
概括地说,将 ReactiveMongo 合并到 http4s 中需要哪些步骤?
说如果我想在 http4s 之类的东西中使用 ReactiveMongo 是否正确,我将不得不将 ReactiveMongo 返回的所有 Future 调用包装在 Cats IO 效果中?
概括地说,将 ReactiveMongo 合并到 http4s 中需要哪些步骤?
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)的任何地方使用这个(或一些委托给这个的实用程序)。