如何解决在 nim 中实现 setInterval/clearInterval
我有以下代码,它在一个间隔内运行传递的 proc,并返回一个 clearInterval proc 来停止运行,如下所示:
proc runInterval(cb: proc,interval: int): Future[proc()] {.async.} =
var stop_run = false
while not(stop_run):
await sleepAsync(intv)
cb()
proc clearInterval() =
stop_run = true
return clearInterval
proc in_interval() =
echo "hahah"
let clearInterval = runInterval(in_interval,1000) # run the in_interval proc every 1 second
clearInterval() # stop in_interval (can't compile)
runForever()
我怀疑 runInterval 的类型注释不正确
: Future[proc()] {.async.} ,但我不知道如何定义返回类型为 proc 和 {.async.} 的 proc ?
解决方法
正如@dom96 建议的那样,您应该像这样使闭包返回 bool:
import asyncdispatch
import random
proc runInterval(cb: proc,interval: int) {.async.} =
var stop_run = false
while not stop_run:
await sleepAsync(interval)
if not cb():
break
proc in_interval(): bool =
if rand(1..6) > 2:
echo "lucky"
true
else:
echo "unlucky"
false
randomize()
discard runInterval(in_interval,500)
runForever()
,
可以通过将 while 循环包装在其自己的异步过程中并从 runInterval
过程中移除异步以直接返回 clearInterval
来实现此模式:
import asyncdispatch
proc runInterval(cb: proc,interval: int): proc() =
var stop_run = false
proc clearInterval() =
stop_run = true
proc runIntervalLoop() {.async.} =
while not(stop_run):
await sleepAsync(interval)
cb()
asyncCheck runIntervalLoop()
return clearInterval
proc in_interval() =
echo "hahah"
proc process {.async.} =
let clearInterval = runInterval(in_interval,1000) # run the in_interval proc every 1 second
await sleepAsync(3000)
echo "Finished sleeping"
clearInterval()
echo "Cleared interval"
waitFor process()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。