帮助我。 这是代码:
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 - &gt;这是问题,因为这将是1000,2000。为什么第二个console.log命令延迟执行?我如何在nodejs中管理定时器??
IN NODEJS: 如果我需要在第一个任务前2秒完全触发任务,那么我怎么能做到这一点,在第一次延迟的很长时间内完成。
答案 0 :(得分:2)
在Node.js中,JavaScript执行仍然是单线程的。只要for
循环使该线程忙,第二个function
和console.log()
就必须等待。
John Resig对“How JavaScript Timers Work”中的计时器有一个很好的解释。
如果我需要在第一个任务之前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
答案 1 :(得分:0)