0

帮助我理解。这是代码:

var start = Date.now();

setTimeout(function () {
    console.log(Date.now() - start);
    for (var i = 0; i < 1000000000; i++){}
    for (var i = 0; i < 1000000000; i++){}
}, 1000);

setTimeout(function () {
    console.log(Date.now() - start);
}, 2000);

在 REPL 或节点服务器中运行此代码时,显示的消息不是正确的。显示的消息是:1000 和 3188 --> 这是问题所在,因为这将是 1000,2000。为什么第二个 console.log 命令延迟执行?我如何管理 nodejs 中的计时器?

在 NODEJS 中:如果我需要在第一个任务前 2 秒准确地触发一个任务,我怎么能做到这一点,不管第一个延迟的时间长短。

4

2 回答 2

2

在 Node.js 中 JavaScript 执行仍然是单线程的。只要for循环保持该线程忙碌,第二个function和第二个console.log()就必须等待。

John Resig 在“ JavaScript 定时器的工作原理”中对定时器进行了很好的解释。

如果我需要在第一个任务前 2 秒准确地触发一个任务,我怎么能做到这一点,不管第一个延迟的时间长短。

您可以将运行时间较长的同步任务(在本例中为for循环)移动到它自己的模块中并使用child_process.fork()它来执行它。

// long-running.js

var start = Number(process.argv[2]);

for (var i = 0; i < 1000000000; i++){}
for (var i = 0; i < 1000000000; i++){}

console.log('3', Date.now() - start);
var child_process = require('child_process');

var start = Date.now();

setTimeout(function () {
    console.log('1', Date.now() - start);
    child_process.fork('./long-running', [start]);
}, 1000);

setTimeout(function () {
    console.log('2', Date.now() - start);
}, 2000);
// output
1 1013
2 2016
3 3395
于 2013-08-21T07:33:19.980 回答
0

这是因为代码不是并行的,并且 setTimeout 函数将代码添加到队列中,以便在可以执行时执行。

MDN说:

delay 是函数调用应该延迟的毫秒数(千分之一秒)。实际延迟可能更长

于 2013-08-21T07:38:29.243 回答