为什么'nextTick'在这里没有按照预期行事?
下面的程序将挂在NodeJS中,有人知道为什么吗?
结束=假; events = require('events'); eventEmitter = new events.EventEmitter(); eventEmitter.on('end',function(){ 结束=真实; }); setTimeout(function(){ eventEmitter.emit( '结束'); },100); while(!ended){ process.nextTick(); } 的console.log( '结束');
nextTick
并不是某种产量操作,它是为了在下次引擎可以自由地调用时调用callback。 它是“挂起”的,因为while
循环的退出条件永远不会满足(并且永远不可能)。
简单的回答:因为Node.JS是单线程的。
长的答案:JavaScript被组织成一个持有事件的队列。 这些事件发射之前,他们不能停止,直到他们完成工作。 也没有其他的代码可以并行运行,因为Node.JS 是单线程的。 这意味着这个代码:
while (!ended) { process.nextTick(); }
是一个无限循环。 ended
variables将永远不会改变,因为end
处理程序不能触发,直到主事件(即您所显示的代码)完成其工作。 而它从来没有。
process.nextTick();
不调用主循环的下一个循环,下一个循环自动出现, .nextTick()
方法用于在下一个循环调用一个callback函数info: http : //nodejs.org/api/process.html# process_process_nexttick_callback 。
while(!ended)
是一个无限循环,这就是为什么应用程序挂起, ended
variables不会改变,直到当前的循环没有结束,这是你的while循环充斥。