Javascript setInterval()保持Node.js进程运行

Javascript setInterval()保持Node.js进程运行,javascript,node.js,coffeescript,Javascript,Node.js,Coffeescript,我在写一些东西,像咖啡脚本里的一个象征性的桶 class TokenBucket constructor: (@speed, @threshold) -> @currentVolume = 0 @interval = setInterval => @currentVolume += 1 if @threshold < @currentVolume @currentVolume = @threshold , @s

我在写一些东西,像咖啡脚本里的一个象征性的桶

class TokenBucket
  constructor: (@speed, @threshold) ->
    @currentVolume = 0
    @interval = setInterval =>
      @currentVolume += 1
      if @threshold < @currentVolume
        @currentVolume = @threshold
    , @speed * 1000

  stop: ->
    clearInterval @interval
    return

  get: ->
    if @currentVolume == 0
      false
    else
      @currentVolume -= 1
      true
class标记桶
构造函数:(@speed,@threshold)->
@currentVolume=0
@间隔=设置间隔=>
@当前卷+=1
如果@threshold<@currentVolume
@currentVolume=@阈值
,@speed*1000
停止:->
clearInterval@interval
返回
获取:->
如果@currentVolume==0
假的
其他的
@当前卷-=1
真的
对于不喜欢咖啡脚本的人,让我简单地解释一下。在构造一个
TokenBucket
之后,它调用
setInterval
,回调每隔几秒钟递增一次“bucket”


问题是,如果用户在存在之前忘记调用
stop
,那么
setInterval
将保持Node.js进程运行,因为事件循环永远不会为空。我想做的是告诉Node.js,这个
setInterval
在“不重要”中,如果其他所有操作都完成了,您可以终止它。我怎样才能做到这一点


我想做的是告诉Node.js,这个setInterval不重要,如果其他的都完成了,您可以终止它。我怎样才能做到这一点

您正在查找,它“将允许您创建一个活动的计时器,但如果它是事件循环中唯一剩下的项,则不会保持程序运行。”


然而,我想知道这是否是最好的解决办法。可能最好让
@curretnVolume
成为一个getter,仅在需要时动态计算其值(取决于当前时间)。差不多

class TokenBucket
  constructor: (@speed, @threshold) ->
    @_start = Date.now()

  Object.defineProperty @::, "currentVolume",
    enumerable: true,
    configurable: true,
    get: ->
      dt = (Date.now() - @_start) / 1000
      Math.min @threshold, Math.floor dt/@speed

  get: ->
    if @currentVolume == 0
      false
    else
      @_start = Math.max @_start, Date.now()-@threshold*@speed*1000 # not 100% accurate
      @_start += @peed*1000
      true

你能描述一下节点应该“看到”什么,或者节点在没有用户发起的
stop
调用的情况下,在代码路径方面终止进程会发生什么情况吗?“我想做的是告诉node.js这个setInterval不重要”。在此上下文中,“重要”是什么意思?当“其他一切都完成了”时,为什么不自己调用
clearInterval
?Mike'Pomax'Kamermans最好停止执行
setInterval()中的回调exit@Vohuman这有点像是说这只是一个协程,如果其他人都在事件循环中完成,那么,请停止一次又一次地执行此操作。谢谢。这正是我要找的。另外,我同意你的观点,最好在需要时计算它的值。这涉及到最后一次查询的时间戳等等,对吗?@Hot.PxL:是的,对。但是,
get()
的减少确实使它有点复杂。我不知道你的确切用例/问题域,所以你可能需要/想要对它进行一些调整,但我想你会明白的。我已经使用Nodejs多年了,以前从未见过这个函数。令人惊叹的。
class TokenBucket
  constructor: (@speed, @threshold) ->
    @_start = Date.now()

  Object.defineProperty @::, "currentVolume",
    enumerable: true,
    configurable: true,
    get: ->
      dt = (Date.now() - @_start) / 1000
      Math.min @threshold, Math.floor dt/@speed

  get: ->
    if @currentVolume == 0
      false
    else
      @_start = Math.max @_start, Date.now()-@threshold*@speed*1000 # not 100% accurate
      @_start += @peed*1000
      true