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

标签 javascript node.js coffeescript

我正在用 CoffeeScript 编写类似 token 桶的东西。

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

对于不熟悉 CoffeeScript 的人,让我简单解释一下。构建 TokenBucket 后,它会调用 setInterval 并每隔几秒增加一次“桶”的回调。

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

最佳答案

What I want to do is to tell Node.js that this setInterval in not important, you can terminate it if everything else is done. How can I achieve that?

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

class TokenBucket
  constructor: (@speed, @threshold) ->
    …
    @interval = setInterval =>
      …
    , @speed * 1000
    @interval.unref()

但是,我想知道这是否是最好的解决方案。可能最好让 @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

关于javascript - setInterval() 保持 Node.js 进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058371/

相关文章:

javascript - 我希望主图像在相册照片页面上的上一张和下一张图像的缩略图之前加载

javascript - 带有样式溢出的嵌套 div 的 jQuery 可拖动 div :auto

javascript - 链接 RSVP promise 的正确方法

javascript - Knex.js 和 MySQL : Casting Integer into Boolean for bulk select

node.js - 在 ubuntu 上安装 coffee-script 可以正确安装所有文件,但命令行不起作用

php - 只是 html/js 还是与服务器端代码混合?

node.js - nginx:无效选项: "off"和 entrypoint.sh::权限被拒绝

javascript - 如何查询每天特定时间创建的所有文档?

javascript - Node.js 和 ES6

javascript - 在 Rails 中的确认对话框中单击“取消”时触发 'click' 事件