1

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

结束=假;

事件 = 要求(“事件”);
eventEmitter = 新事件。EventEmitter();
eventEmitter.on('end', function() {
  结束=真;
});
设置超时(函数(){
  eventEmitter.emit('end');
}, 100);

而(!结束){
  process.nextTick();
}

console.log('结束');
4

3 回答 3

4

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

于 2012-07-26T13:52:54.160 回答
2

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

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

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

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

于 2012-07-26T13:53:29.307 回答
1

process.nextTick();不调用主循环的下一个循环,下一个循环自动到来,.nextTick()方法用于在下一个循环调用回调函数,信息:http ://nodejs.org/api/process.html#process_process_nexttick_callback 。

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

于 2012-07-26T14:06:55.113 回答