Node.js 为什么process.stdin上的侦听器阻止节点终止?
我是一名试图理解node的Java程序员。对我来说没有意义的是,下面的代码如何阻止进程终止Node.js 为什么process.stdin上的侦听器阻止节点终止?,node.js,Node.js,我是一名试图理解node的Java程序员。对我来说没有意义的是,下面的代码如何阻止进程终止 process.stdin.on('data', function(data) { console.log('Foobar'); } ); 这就引出了很多问题-: 如果有监听器连接到任何对象或只是全局进程对象,NodeJs会继续运行吗 如果连接了侦听器,为什么NodeJs不会终止 这只是数据事件的行为吗?或者其他事件也会导致相同的行为 阻止节点进程终止的其他方法有哪些 节点完成其工作后
process.stdin.on('data', function(data) {
console.log('Foobar');
}
);
这就引出了很多问题-:
节点完成其工作后退出。如果您设置了事件侦听器,它将不会终止,因为它还有一个作业要运行—您的代码告诉您,它必须侦听某种类型的事件。因此,只要它是绑定到任何仍然存在的对象并可以调用的任何事件侦听器,它就会继续运行。如果发生退出事件,节点将为您清除所有内容。更新: 根据该文件,从技术上讲: Node.js检查它是否正在等待任何异步I/O或计时器,如果没有,则完全关闭
根据Node.js文档: 通常,当没有安排工作时,Node.js进程将退出 因此,Node.js是否终止取决于是否还有计划的工作 对于您的
process.stdin.on('data')…
示例,当代码完成执行时,仍然有计划的工作--应该捕获并处理用户输入。因此,Node.js进程不会终止
另一个例子是HTTP请求。如果Node.js发送HTTP请求(返回请求需要30秒),则Node.js进程将不会终止,直到检索并处理响应——除非完成所有计划的工作,否则Node.js进程将继续运行
当然,计划的工作是否“完成”是由Node.js定义的——在HTTP请求的情况下,如果您只发送请求而不关心响应(没有响应处理程序),则有两种方法将此计划的工作定义为“完成”:A.发送HTTP请求,仅此而已。B.发送HTTP请求并检索响应,无论是否存在任何响应处理程序。Node.js选择策略B
第三个例子是自定义事件及其事件侦听器。考虑下面的代码:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
当此代码执行完成时,尽管仍然存在事件侦听器,但Node.js进程将终止,因为Node.js检测到不再存在计划的工作—没有代码正在运行,也没有其他处理程序正在等待,因此自定义事件将不再触发
因此,对于您的4个问题:
1.如果有监听器连接到任何对象或仅连接到全局进程对象,NodeJs会继续运行吗
不仅仅是全局进程对象。对于监听器,它取决于是否还有计划的工作(监听器是否可能被触发)
2.如果连接了侦听器,为什么NodeJs不会终止
JavaScript使用单线程模型,并使用事件循环处理各种动作逻辑。如果Node.js在主代码执行后终止,则只能用于编写非常小的程序。它将无法侦听用户动作/外部请求等
3.这是仅针对数据事件的行为吗?还是其他事件也会导致相同的行为
其他事件也可能导致相同的行为,这取决于该事件是否会触发计划的工作
4.阻止节点进程终止的其他方法有哪些
process.stdin.on('data', function(data) {
console.log('Foobar');
}
);
无论什么时候可以稍后调用事件侦听器。1.如果有侦听器连接到任何对象或仅连接到全局进程对象,NodeJs会继续运行吗? 这与
process.stdin
正在创建一个socket
更确切地说是net.socket()
这是一个双工流,可读写,也是一个EventEmitter
类,因此当您将侦听器连接到进程时。stdin
打开套接字,等待在套接字中写入|读取某些内容
因此这里的问题不是EventEmitter的
处理程序,而是等待end
事件终止进程的流
2.如果连接了侦听器,为什么NodeJs不会终止?
因为您打开了一个套接字连接,所以只有一个特殊的结束事件才会发生
终止它。在您的情况下,当您发出终止命令时,它将终止,该命令将触发一个特殊的end
事件CTRL+C
3.这是仅针对数据事件的行为吗?还是其他事件也会导致相同的行为?
对于进程.stdin
所有事件和其他连接类型i/o.db连接、http请求等
4.阻止节点进程终止的其他方法有哪些?
- 运行同步无限循环
- 打开插座,不要合上
process.stdin.constructor.toString()
函数读取流(fd,选项){
如果(!(此ReadStream实例))
返回新的读流(fd,选项);
如果(fd>>0!==fd | | fd<0)抛出新错误。RangeError('ERR_INVALID_fd',fd');
选项=util.\u扩展({
高水位线:0,
可读性:对,
可写:false,
句柄:新TTY(fd,真)
},选项);
net.Socket.call(这个,选项);
this.isRaw=false;
this.isTTY=true;
}
+1,让我知道这是一个正在打开的套接字连接。现在可以理解为什么程序没有终止。但我的下一步将是创建套接字的时间