1

我正在尝试在我的 NodeJS 环境中创建一个循环,该循环每秒执行 30 次(基于固定变量)。有人告诉我,这setInterval不是setTimeoutNodeJS 的方式,因为它可以遵守 NodeJS 中process.nextTicksetImmediateI/O 队列。我尝试使用以下代码(setImmediate):

var Physics = {
    lastTime: (new Date().getTime()),
    upsCounter: 0,
    ups: 0,

    init: function() {
        Physics.loop();
    },

    loop: function() {
        var currentTime = (new Date().getTime());
        Physics.upsCounter += 1;

        if((currentTime - Physics.lastTime) >= 1000) {
            Physics.ups = Physics.upsCounter;
            Physics.upsCounter = 0;
            Physics.lastTime = currentTime;

            console.log('UPS: ' + Physics.getUPS());
        }

        setImmediate(Physics.loop);
    },

    getUPS: function() {
        return this.ups;
    }

};

我的问题是每秒更新数 (UPS) 超过 400,000,而不是要求的 30,我想知道是否有任何方法可以将其限制为这个数字,或者替代循环结构。谢谢

4

2 回答 2

2

我被告知 setInterval 和 setTimeout 不是 NodeJS 的方式

当然,它们是您需要超时或间隔的时候!

setImmediate/ nextTickare immediate,这不是你想要的。你不能限制它们,它们在设计上尽可能快。

如果setInterval不够准确或漂移,则使用自调整计时器

于 2013-09-10T11:14:57.273 回答
0

您应该继续使用setIntervalorsetTimeout方法,但请确保取消引用它们,这样它们就不会阻止本来会退出的进程,除非该计时器是程序的主要执行。

请参阅:节点计时器 API 文档

javascript var t = setInterval(myMethod, 100); t.unref(); //the timer t will not execute if the rest of the program is ready to exit.

于 2014-05-16T21:32:55.677 回答