Node.js 在NodeJS的引擎盖下,可读的位置和方式。\u read()正在被调用?

Node.js 在NodeJS的引擎盖下,可读的位置和方式。\u read()正在被调用?,node.js,nodejs-stream,Node.js,Nodejs Stream,我对下面的程序很好奇。这个程序只在消费者请求时才将字母“a”到“z”推送到可读的流中。我从文档中了解到,\u read()实现是由内部Readable类方法调用的。如果您使用命令node app.js | head-c5从终端运行此程序,那么我们可以看到当我们只请求5个字节时,\u read()只被调用了5次,因此它只打印abcde 我想知道这个\u read()实现在节点源代码中的何处被调用?。或者,当我们请求5字节的数据时,节点中的哪个源代码\u read()被调用了5次 我很想知道这一点,

我对下面的程序很好奇。这个程序只在消费者请求时才将字母“a”到“z”推送到可读的流中。我从文档中了解到,
\u read()
实现是由内部
Readable
类方法调用的。如果您使用命令
node app.js | head-c5
从终端运行此程序,那么我们可以看到当我们只请求5个字节时,
\u read()
只被调用了5次,因此它只打印
abcde

我想知道这个
\u read()
实现在节点源代码中的何处被调用?。或者,当我们请求5字节的数据时,节点中的哪个源代码
\u read()
被调用了5次

我很想知道这一点,如果有人能帮我弄明白,那就太好了

var Readable = require('stream').Readable;
var rs = Readable();

var c = 97 - 1;

rs._read = function () {
    if (c >= 'z'.charCodeAt(0)) return rs.push(null);
    
    setTimeout(function () {
        rs.push(String.fromCharCode(++c));
    }, 100);
};

rs.pipe(process.stdout);

process.on('exit', function () {
    console.error('\n_read() called ' + (c - 97) + ' times');
});
process.stdout.on('error', process.exit);

管道功能是触发点

  • 调用
    pipe
    函数时,会触发
    on('data',…)
    事件
  • 此事件使用
    \u read
    实现提取流的数据
  • 现在,您的可读流已经填充了数据
关于
head
命令

  • 该命令查找输出util
    -c
    字符。比如说
    head-c5
    一旦打印了5个字符,它就会发出信号,指示上一个进程退出
  • 收到此信号后,节点进程运行退出功能并终止,因此停止进一步执行
    \u read
    ,并打印在此之前读取的字符数
下面是从VS代码捕获的读取函数的调用堆栈:


我可以知道您是如何在VS代码中获取此Stacktrace的。请跟踪并在VSCode调试窗格中查找“调用堆栈”。由于“node app.js | head-c5”命令,我的_read()实现只调用了5次,这意味着它只将5字节的数据推入缓冲区。因此,我们只得到“abcde”作为输出。但我的假设是,在节点源代码中的某个地方有一个循环,在这种情况下它只会迭代5次,并且只将5个字节的数据推入缓冲区。所以我希望在源代码中的某个地方有这样的代码。