代码之家  ›  专栏  ›  技术社区  ›  Joe Enos

在readline启动后定义事件处理程序

  •  0
  • Joe Enos  · 技术社区  · 6 年前

    readline.createInterface ,然后附加事件处理程序 line close

    似乎没有什么东西可以“启动”读者。它只是去,似乎工作得很完美。它怎么知道什么时候开始阅读?它如何保证那些还不存在的事件将始终拾取文件中的每一行?

    我一直认为这一切发生得太快了,以至于事件的附加速度比从磁盘打开文件并开始读取它所需的速度要快,但这并不能真正起作用。

    例如,假设我在创建lineReader之后,但在附加事件之前,放置了一些占用大量CPU的代码。它似乎仍然有效,而且每一条线路的事件仍在发生。它是如何“等到”完成繁重的工作后才开始阅读的?如果我不把 线 事件,然后它仍然运行,并且 事件仍在发生,所以它不像是在等待 线

    var lineReader = readline.createInterface({
        input: fs.createReadStream("input.txt")
    });
    
    // EVENTS HAVE NOT BEEN CREATED YET
    
    lineReader.on("line", line => { console.log(line); });
    lineReader.on("close", () => { console.log("DONE"); });
    

    这不是特定于 lineReader -似乎是一种常见的节点模式-这只是最容易定义和运行的模式。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

    在内部, readline.createInterface() data 添加了事件侦听器。

    而且,在 ,一个 数据 已添加事件处理程序。这会让水流开始流动,然后它会开始发光 数据 readline代码将解析为行事件的事件。

    另外,由于node.js和streams是事件驱动的,node.js作为单线程运行Javascript,这意味着在安装代码完成执行之前不会发生任何事件。在内部,node.js可能已经开始读取文件(在内部使用异步I/O和线程),但即使它在安装程序代码完成执行之前完成了对文件的第一次读取,它所做的只是插入 事件队列中的事件。node.js不会处理这个 数据 事件,直到安装程序代码完成执行并将控制权返回到node.js事件循环。

    那么 数据 将调用事件回调,readline代码将解析第一个事件中的数据,如果第一个数据事件中有整行,则它将触发 line 事件。

    附加 数据 readStream上的事件处理程序(readline代码的内部)告诉流开始流动。

    它只是去,似乎工作得很完美。它怎么知道什么时候开始阅读?

    同上。

    它如何保证那些还不存在的事件将始终拾取文件中的每一行?

    readline代码从 数据 线 找到的每一行的事件。当文件读取越过一个行边界时,它必须缓冲一个部分行并等待下一行的其余部分 数据 来自流的事件。

    当linereader代码看到流已完成读取并且没有更多字节时,它发送最后一行(如果缓冲区中有一行),然后发出 close 事件通知侦听器它已全部完成。

    例如,假设我在创建lineReader之后,但在附加事件之前,放置了一些占用大量CPU的代码。它似乎仍然有效,而且每一条线路的事件仍在发生。它是如何“等到”完成繁重的工作后才开始阅读的?

    这是因为node.js是事件驱动的。第一次 数据 来自流(readline代码内部)的事件是 fs.readFile()

    正是这种单线程、事件驱动的特性,确保在触发事件之前安装事件侦听器,这样就不会错过它们。

    对的。readline代码附加 事件处理程序 createInterface() 打电话,不管你有没有 线 是否事件侦听器。因此,流将开始流动,文件将被读取是否有 线 是否为事件处理程序。


    a link to the createInterface() function 你可以看到我在这里所描述的。

    你可以看到 here in the stream doc ,其中is描述流开始流动的三种方式,其中之一是附加 数据 事件侦听器。