【问题标题】:Implement cancelable setInterval using cats-effect's Timer使用 cat-effect 的 Timer 实现可取消的 setInterval
【发布时间】:2018-08-17 01:38:42
【问题描述】:

这是我尝试过的,但是在第一次睡眠结束后无法取消。

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

【问题讨论】:

    标签: scala scala-cats cats-effect


    【解决方案1】:

    Fabio Labella的帮助下,我认出了

    F.liftIO(F.runAsync(F.suspend(run))(_ => IO.unit)) *> fa
    

    runAsync 只是让下一个递归调用在后台运行并且不可取消,所以我不得不在后台创建fa,就像这样

    F.liftIO(F.runAsync(fa)(_ => IO.unit)) *> F.suspend(run)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多