如何将Cats Effect 3转换为Future



我正在尝试将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]资源上使用allocatedIORuntime的unsafeRunSync进行一些操作,具体取决于您的应用程序是如何连接的)

相关内容

  • 没有找到相关文章

最新更新