我正在尝试将Playframework与Cats Effect 3 Tagless Final风格结合起来。
我被困在向未来的转变上了。Play的Action只需要value或Future,这是我想要达到的,用于异步处理。
def method = authed { _ =>
val program: EitherT[IO, Throwable, Int] = ???
program
}
def authed[F[_]: Async](fa: Request => F[Result]): Action = {
???
}
在cats效应2中,这是可能通过_.toIO.unsafeToFuture
实现的,但现在它改变了。根据文件,我必须使用Dispatcher。在Github上找到了最初的想法,但新的签名是F[Future[A]]
def beforeF[F[_]: Effect, A](fa: F[A]): Future[A] = fa.ioIO.unsafeToFuture()
// Note: Using a `Dispatcher` resource is cheap - don't worry about it
def preferredAfterF[F[_]: Async, A](fa: F[A]): F[Future[A]] = Dispatcher[F].use(_.unsafeToFuture(fa))
有人成功过吗?
构造你的路由,使它们可以访问一个Disptacher
对象作为一个依赖,然后生命周期将是合适的
class MyRoute[F[_]: MonadThrow](disp: Dispatcher[F]) {
def method = authed { _ =>
val program: EitherT[IO, Throwable, Int] = ???
disp.unsafeToFuture(program.value)
}
}
(这可能需要在Dispatcher[IO]
资源上使用allocated
和IORuntime
的unsafeRunSync进行一些操作,具体取决于您的应用程序是如何连接的)