以下程序将挂在 NodeJS 中,有人知道为什么吗?
结束=假; 事件 = 要求(“事件”); eventEmitter = 新事件。EventEmitter(); eventEmitter.on('end', function() { 结束=真; }); 设置超时(函数(){ eventEmitter.emit('end'); }, 100); 而(!结束){ process.nextTick(); } console.log('结束');
以下程序将挂在 NodeJS 中,有人知道为什么吗?
结束=假; 事件 = 要求(“事件”); eventEmitter = 新事件。EventEmitter(); eventEmitter.on('end', function() { 结束=真; }); 设置超时(函数(){ eventEmitter.emit('end'); }, 100); 而(!结束){ process.nextTick(); } console.log('结束');
nextTick
不是某种yield操作,它用于安排在下次引擎空闲时调用回调。它是“挂起”的,因为while
循环的退出条件永远不会满足(并且永远不可能,使用该代码)。
简短的回答:因为 Node.JS 是单线程的。
长答案:JavaScript 被组织成一个包含事件的队列。这些事件在触发时无法停止,直到它们完成工作。也没有其他代码可以并行运行,因为 Node.JS是单线程的。这意味着这段代码:
while (!ended) {
process.nextTick();
}
是一个无限循环。该ended
变量永远不会改变,因为end
在主事件(即您向我们展示的代码)完成其工作之前,处理程序无法触发。它永远不会。
process.nextTick();
不调用主循环的下一个循环,下一个循环自动到来,.nextTick()
方法用于在下一个循环调用回调函数,信息:http ://nodejs.org/api/process.html#process_process_nexttick_callback 。
while(!ended)
是一个无限循环,这就是应用程序挂起的原因,ended
变量不会改变,直到当前循环没有结束,这会被你的 while 循环淹没。