微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在NodeJS的幕后何处以及如何调用read._read?

如何解决在NodeJS的幕后何处以及如何调用read._read?

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

我想知道此_read()实现在Node源代码中的什么位置?还是当我们请求5个字节的数据时,在节点源代码_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',...)事件。
  • 此事件使用您的 _read 实现为流提取数据。
  • 现在您的可读流已填充了数据。

关于head命令,

  • 该命令寻找输出util -c字符。说head -c 5一旦打印了5个字符,就表示退出前一个过程。
  • 接收到该信号后,节点进程将运行退出功能并终止,因此停止进一步执行_read并打印直到此为止读取的字符数。

这是从VS Code捕获的_read函数的调用堆栈

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。