为什么'nextTick'在这里表现不如预期?

时间:2012-07-26 13:48:27

标签: javascript node.js

以下程序将在NodeJS中挂起,有人知道为什么吗?

ended = false;

events = require('events');
eventEmitter = new events.EventEmitter();
eventEmitter.on('end', function() {
  ended = true;
});
setTimeout(function() {
  eventEmitter.emit('end');
}, 100);

while (!ended) {
  process.nextTick();
}

console.log('ended');

3 个答案:

答案 0 :(得分:4)

nextTick不是某种yield操作,它是用于安排在下次引擎可以自由调用时调用回调。它是“悬挂”的,因为while循环的退出条件永远不会得到满足(并且永远不会,使用该代码)。

答案 1 :(得分:2)

简短回答:因为Node.JS是单线程的。

答案很长:JavaScript被组织成一个包含事件的队列。这些事件在被解雇之前无法停止,直到他们完成工作。此外,没有其他代码可以并行运行,因为Node.JS 是单线程的。这意味着这段代码:

while (!ended) {
  process.nextTick();
}

是一个infinie循环。 ended变量永远不会改变,因为end处理程序在主事件(即您向我们展示的代码)完成其工作之前无法触发。它从来没有。

答案 2 :(得分:1)

process.nextTick();没有调用主循环的下一个循环,下一个循环自动进入,.nextTick()方法用于在下一个循环调用回调函数,info:http://nodejs.org/api/process.html#process_process_nexttick_callback

while(!ended)是一个无限循环,这就是应用程序挂起的原因,ended变量在当前循环没有结束之前不会改变,这会被你的while循环淹没。