nodejs流基类怎么实现
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"nodejs流基类怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"nodejs流基类怎么实现"吧!流是对数据生产,消费的一种
千家信息网最后更新 2026年11月01日nodejs流基类怎么实现
这篇文章主要讲解了"nodejs流基类怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"nodejs流基类怎么实现"吧!
流是对数据生产,消费的一种抽象,今天先分析一下流基类的实现
const EE = require('events');
const util = require('util');
// 流的基类
function Stream() {
EE.call(this);
}
// 继承事件订阅分发的能力
util.inherits(Stream, EE);
流的基类只提供了一个函数就是pipe。用于实现管道化。这个方法代码比较多,分开说。
1 处理数据事件
function ondata(chunk) {
// 源流有数据到达,并且目的流可写
if (dest.writable) {
// 目的流过载并且源流实现了pause方法,那就暂停可读流的读取操作,等待目的流触发drain事件
if (false === dest.write(chunk) && source.pause) {
source.pause();
}
}
}
// 监听data事件,可读流有数据的时候,会触发data事件
source.on('data', ondata);
function ondrain() {
// 目的流可写了,并且可读流可读,切换成自动读取模式
if (source.readable && source.resume) {
source.resume();
}
}
// 监听drain事件,目的流可以消费数据了就会触发该事件
dest.on('drain', ondrain);
这是管道化时流控实现的地方,主要是利用了write返回值和drain事件。
流关闭/结束处理
// 目的流不是标准输出或标准错误,并且end不等于false
if (!dest._isStdio && (!options || options.end !== false)) {
// 源流没有数据可读了,执行end回调,告诉目的流,没有数据可读了
source.on('end', onend);
// 源流关闭了,执行close回调
source.on('close', onclose);
}
// 两个函数只会执行一次,也只会执行一个
var didOnEnd = false;
function onend() {
if (didOnEnd) return;
didOnEnd = true;
// 执行目的流的end函数,说明写数据完毕
dest.end();
}
function onclose() {
if (didOnEnd) return;
didOnEnd = true;
// 销毁目的流
if (typeof dest.destroy === 'function') dest.destroy();
}
这里是处理源流结束和关闭后,通知目的流的逻辑。
错误处理和事件清除
// remove all the event listeners that were added.
function cleanup() {
source.removeListener('data', ondata);
dest.removeListener('drain', ondrain);
source.removeListener('end', onend);
source.removeListener('close', onclose);
source.removeListener('error', onerror);
dest.removeListener('error', onerror);
source.removeListener('end', cleanup);
source.removeListener('close', cleanup);
dest.removeListener('close', cleanup);
}
function onerror(er) {
// 出错了,清除注册的事件,包括正在执行的onerror函数
cleanup();
// 如果用户没有监听流的error事件,则抛出错误,所以我们业务代码需要监听error事件
if (EE.listenerCount(this, 'error') === 0) {
throw er; // Unhandled stream error in pipe.
}
}
// 监听流的error事件
source.on('error', onerror);
dest.on('error', onerror);
// 源流关闭或者没有数据可读时,清除注册的事件
source.on('end', cleanup);
source.on('close', cleanup);
// 目的流关闭了也清除他注册的事件
dest.on('close', cleanup);
这里主要是处理了error事件和流关闭/结束/出错时清除订阅的事件。这就是流基类的所有逻辑。
感谢各位的阅读,以上就是"nodejs流基类怎么实现"的内容了,经过本文的学习后,相信大家对nodejs流基类怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
事件
目的
数据
源流
处理
监听
函数
就是
错误
学习
代码
内容
方法
标准
管道
逻辑
消费
订阅
业务
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
耶加雪菲
为想互联网科技怎么样
重生之互联网科技帝国
深圳互联网科技公司
互联网的科技创新
互联网科技上市公司
一五八零互联网科技
新华互联网科技校企合作
太原新华互联网科技学校怎么样
安控科技rtu产品工业互联网
银川新华互联网科技职业技术培训学校图片
阿里互联网科技公司
宁夏科技产业互联网案例
玉溪互联网科技怎么选
长沙互联网科技
每天都有哪些好的互联网科技
21世纪互联网科技成就
江苏互联网智能科技产品出厂价
互联网科技自媒体灵感
高科技和互联网的现代国家
互联网科技公司简介
中国 科技 互联网
兼蜜互联网科技
多迪互联网科技有限公司
新华互联网科技2019
互联网为啥属于高科技
广州新华互联网科技学校电竞方面
深圳艾果互联网通讯科技
21世纪互联网科技成就
银川新华互联网科技学校招聘