我希望用户可以运行带有回调的计时器并能够取消它。像这样的东西:
def main: F[Unit] =
for
cancel <- runTimer(callback, 5.seconds)
shouldCancel <- askUser
_ <- cancel.whenA(shouldCancel)
yield ()
对于FS2的猫我该如何做到这一点?
您需要的代码实际上非常简单,这要归功于 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