在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()

最新更新