这就是我尝试过的,但是在第一次睡眠结束后它是不可取消的。
import cats.syntax.all._
import cats.effect._
import scala.concurrent.duration._
import scala.language.higherKinds
object Foo {
def setInterval[F[_]](duration: FiniteDuration)(
fa: F[Unit]
)(implicit F: ConcurrentEffect[F], T: Timer[F]): F[IO[Unit]] = {
def run: F[Unit] = {
T.sleep(duration) *>
F.liftIO(F.runAsync(F.suspend(run))(_ => IO.unit)) *> fa
}
F.liftIO(F.runCancelable(run)(_ => IO.unit))
}
}我如何实现一个真正的可取消的setInterval?
发布于 2018-08-18 15:05:24
在Fabio Labella的帮助下,我认识到
F.liftIO(F.runAsync(F.suspend(run))(_ => IO.unit)) *> farunAsync只是让下一个递归调用在后台运行,并且是不可取消的,所以我不得不让fa在后台运行,就像这样
F.liftIO(F.runAsync(fa)(_ => IO.unit)) *> F.suspend(run)https://stackoverflow.com/questions/51887327
复制相似问题