Node.js 为什么process.stdin上的侦听器阻止节点终止?

Node.js 为什么process.stdin上的侦听器阻止节点终止?,node.js,Node.js,我是一名试图理解node的Java程序员。对我来说没有意义的是,下面的代码如何阻止进程终止 process.stdin.on('data', function(data) { console.log('Foobar'); } ); 这就引出了很多问题-: 如果有监听器连接到任何对象或只是全局进程对象,NodeJs会继续运行吗 如果连接了侦听器,为什么NodeJs不会终止 这只是数据事件的行为吗?或者其他事件也会导致相同的行为 阻止节点进程终止的其他方法有哪些 节点完成其工作后

我是一名试图理解node的Java程序员。对我来说没有意义的是,下面的代码如何阻止进程终止

process.stdin.on('data', function(data) {
 console.log('Foobar');
        }
);
这就引出了很多问题-:

  • 如果有监听器连接到任何对象或只是全局进程对象,NodeJs会继续运行吗
  • 如果连接了侦听器,为什么NodeJs不会终止
  • 这只是数据事件的行为吗?或者其他事件也会导致相同的行为
  • 阻止节点进程终止的其他方法有哪些

  • 节点完成其工作后退出。如果您设置了事件侦听器,它将不会终止,因为它还有一个作业要运行—您的代码告诉您,它必须侦听某种类型的事件。因此,只要它是绑定到任何仍然存在的对象并可以调用的任何事件侦听器,它就会继续运行。如果发生退出事件,节点将为您清除所有内容。

    更新:

    根据该文件,从技术上讲:

    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,让我知道这是一个正在打开的套接字连接。现在可以理解为什么程序没有终止。但我的下一步将是创建套接字的时间