如何在 Scala Cats / FS2 中进行可取消的超时回调?

问题描述 投票:0回答:1

我希望用户可以运行带有回调的计时器并能够取消它。像这样的东西:

def main: F[Unit] =
  for
    cancel       <- runTimer(callback, 5.seconds)
    shouldCancel <- askUser
    _            <- cancel.whenA(shouldCancel)
  yield ()

对于FS2的猫我该如何做到这一点?

scala scala-cats fs2
1个回答
0
投票

您需要的代码实际上非常简单,这要归功于 cats-effect 在解决并发问题方面非常强大:

def runTimer(
  callback: IO[Unit],
  delay: Duration,
  cancel: IO[Unit]
): IO[Unit] =
  IO.race(
    IO.sleep(delay) >> callback.uncancelable,
    cancel
  ).void

关键方面如下:

  • 使用
    IO.sleep
    延迟回调的执行。
  • 使用
    uncancelable
    使回调不可取消。
  • 使用
    IO.race
    同时运行延迟回调和取消。如果
    cancel
    在延迟之前完成,
    race
    将取消回调的执行。

您可以对此进行改进,以确保

cancel
无法取消
callback
,但允许上级取消取消整个
race


您可以在此处查看运行代码的演示:https://scastie.scala-lang.org/BalmungSan/kL1zxOicSB6IegetK7AWLg/3

© www.soinside.com 2019 - 2024. All rights reserved.