使用 Async[F] 将 Future[A] 转换为 F[A]

Transform Future[A] to F[A] with Async[F]

我正在使用 Slick 和 Cats。

database.run returns a Future,但我需要我的 class(在 F[_]: Async 上通用)的方法到 return a单子F。我可以让它像这样工作

val future = database.run(insertion)    
val result = Await.result(future, Duration.Inf)    
Async[F].delay(result)

但这肯定不是应该这样做的方式,因为它会阻塞线程。

有什么正确的方法吗?

Async.fromFuture就是你所需要的。
一如既往,scaladoc 是你的朋友。

import cats.effect.{Async, ContextShift]

def foo[F[_] : Async : ContextShift]: F[Result] =
  Async.fromFuture(Async[F].delay(database.run(insertion)))