【问题标题】:Is there a better way to execute a node.js callback at regular intervals than setInterval?有没有比 setInterval 更好的方法来定期执行 node.js 回调?
【发布时间】:2013-03-29 20:22:28
【问题描述】:

我有一个 node.js 脚本,可以将流写入这样的数组:

var tempCrossSection = [];

stream.on('data', function(data) {
    tempCrossSection.push(data);
});

以及另一个清空数组并对数据进行一些处理的回调,如下所示:

var crossSection = [];

setInterval(function() {
    crossSection = tempCrossSection;
    tempCrossSection = [];

    someOtherFunction(crossSection, function(data) {
        console.log(data);
    }
}, 30000);

在大多数情况下这是可行的,但有时 setInterval 回调会在 30000 毫秒的时间间隔内执行多次(而且它不是事件循环上的排队调用)。我也将其作为具有相同结果的 cronJob 完成。我想知道是否有办法确保 setInterval 每 30000 毫秒只执行一次。也许有一个更好的解决方案。谢谢。

【问题讨论】:

    标签: node.js callback stream


    【解决方案1】:

    当你有异步的东西时,你应该使用 setTimeout 代替,否则如果异步函数需要很长时间,你最终会遇到问题。

    var crossSection = [];
    
    setTimeout(function someFunction () {
        crossSection = tempCrossSection;
        tempCrossSection = [];
    
        someOtherFunction(crossSection, function(data) {
            console.log(data);
            setTimeout(someFunction, 30000);
        }
    }, 30000);
    

    【讨论】:

    • 这在技术上是正确的,但如果您的情况下的函数花费的时间太长,那么您最终不会每 30 秒触发一次,而不是可能重叠触发。另外,如果 someOtherFunction 调用它的回调失败,那么你的循环就永远死了。
    • @methai 您的顾虑已被注意到,但对于我的应用程序,此递归 setTimeout 对我有用。
    【解决方案2】:

    javascript 中的计时器并不像许多人想象的那么可靠。听起来你已经发现了!关键是测量自上次调用计时器回调以来经过的时间,以决定是否应该在此循环中运行。

    http://www.sitepoint.com/creating-accurate-timers-in-javascript/

    最终目标是构建一个计时器,例如每秒触发一次(比您的超时值更高的精度),然后决定 是否会触发您的函数。

    【讨论】:

    • 感谢您的输入,但是对于为什么 setInterval 在每个间隔内多次触发的任何想法?
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多