【问题标题】:Polling with a fixed delay in node.js在 node.js 中以固定延迟轮询
【发布时间】:2011-12-01 21:37:46
【问题描述】:

我正在寻找一种方法来定期执行后台活动,其中活动的执行时间可能会超过轮询间隔。

在 Java 术语中,我会使用 Executor.scheduleWithFixedDelay。这确保了仅在运行任务完成后才调用后续调用,因此在任何给定时间只有一个任务实例在运行,并且它将始终等待所需的时间间隔,然后再次轮询。

目前我需要记住让每个活动在完成后自行重新安排。有没有实现相同功能的 node.js / javascript 库?

【问题讨论】:

  • 这是你想在客户端做的事情还是你想实现长轮询?
  • 没有客户端 - 都是在节点中运行的服务器端 javascript。

标签: javascript node.js asynchronous


【解决方案1】:

如果您只想每隔几秒钟运行一个简单的函数,您可以使用setInterval

setInterval 将安排在指定的定期间隔调用您的回调。如果您的回调需要更长的时间,那么完成等待的“延迟”调用就会尽快运行。如果您需要超过两个间隔才能完成,那么它会忽略较旧的“滴答声”并仅保留最新的。

var task_is_running = false;
setInterval(function(){
    if(!task_is_running){
        task_is_running = true;
        do_something(42, function(result){
            task_is_running = false;
        });
    }
}, time_interval_in_miliseconds);

有关 setInterval 的详细说明以及与 setTimeout 的比较,请参阅https://stackoverflow.com/a/731625/90511

【讨论】:

  • 即使回调在做 IO 也是如此吗?我认为即使之前的调用仍在等待 IO 回调,setInterval 也会触发?
  • 是的,它会再次触发。但是如果你想避免同时的 IO 请求,你可以设置一个“锁定”变量或类似的东西
  • 谢谢,这似乎是最接近的等价物。我希望有一种比检查锁变量更好的方法,尽管将整个事情包装成一个函数不会太难。
  • @Darren:是的,我强烈建议包装这个并隐藏 lock 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多