以下程序将挂在 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 循环淹没。