在Node.js中,这些调用是相同的吗?

6

我想知道这两个代码块在Node.js中是否相同?

// Style 1
setTimeout(function () {
  console.log('hello');
}, 0);


// Style 2
console.log('hello');

因为我在上面将超时设置为0,所以不需要等待时间。这与直接调用console.log('hello')且不使用setTimeout是否相同?


@Quentin 这对于 Node.js 有任何影响吗? - Nam Nguyen
@Quentin,你是说在我的情况下,在Node.js中使用setTimeout 0会是一样的吗?谢谢你的反馈。 - Nam Nguyen
是的,Node.js会像对待JavaScript一样对待JavaScript。 - Quentin
2个回答

8
他们是不同的,第一个将功能添加到事件队列中,以便在当前执行路径完成后有机会立即执行。第二个将立即执行它。
例如:
console.log('first');

setTimeout(function(){
  console.log('third');
}, 0);

console.log('second');

那些被打印出来的顺序是明确定义的,你甚至可以在打印“second”之前做一些缓慢但同步的工作。保证在回调setTimeout之前执行console.log('second');
console.log('first');

setTimeout(function () {
  console.log('third'); // Prints after 8 seconds
}, 0);

// Spinlock for 3 seconds
(function(start){ while(new Date - start < 3000); })(new Date);

console.log('second'); // Prints after 3 seconds, but still before 'third'

// Spinlock for 5 seconds
(function(start){ while(new Date - start < 5000); })(new Date);

2
@NamNguyen 是的,这对于Node.js和Web浏览器都是正确的。 - Paul
ic和thanks。所以这两个函数是不同的,无论是在Web还是Node.js中。有趣的是,学到了新东西! - Nam Nguyen
好东西。脚本的结果将按照第一、第二和第三的顺序打印出来。 - Nam Nguyen
1
值得一提的是,如果你只想在Node.js上实现上述行为,process.nextTick(...)是比setTimeout(..., 0)更高效的替代方案,因为它不涉及计时器调度的开销。 - Matt Patenaude

-3
严格来说,它们并不完全相同 - setTimeout给浏览器一个机会“赶上”它迫切需要完成的任何任务。但就我们通常关心的情况而言,99%的时间它们将做相同的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接