以下程序将在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');
答案 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循环淹没。