位置: 编程技术 - 正文

Node.js pipe实现源码解析(node.js import)

发布时间:2024-02-27

推荐整理分享Node.js pipe实现源码解析(node.js import),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs 开源项目,node.js import,nodejs换源,node.js import,node.js import,nodejs开源协议,nodejs pipe(),nodejs换源,内容如对您有帮助,希望把文章链接给更多的朋友!

从前面两篇文章,我们了解到。想要把 Readable 的数据写到 Writable,就必须先手动的将数据读入内存,然后写入 Writable。换句话说,每次传递数据时,都需要写如下的模板代码

为了方便使用,Node.js 提供了 pipe() 方法,让我们可以优雅的传递数据

现在,就让我们来看看它是如何实现的吧

pipe

首先需要先调用 Readable 的 pipe() 方法

执行 pipe() 函数时,首先将 Writable 记录到 state.pipes 中,然后绑定相关事件,最后如果 Readable 不是 flow 模式,就调用 resume() 将 Readable 改为 flow 模式

传递数据

Readable 从数据源获取到数据后,触发 data 事件,执行 ondata()

ondata() 相关代码:

在 ondata(chunk) 函数内,通过 dest.write(chunk) 将数据写入 Writable

此时,在 _write() 内部可能会调用 src.push(chunk) 或使其 unpipe,这会导致 awaitDrain 多次增加,不能清零,Readable 卡住

Node.js pipe实现源码解析(node.js import)

当不能再向 Writable 写入数据时,Readable 会进入 pause 模式,直到所有的 drain 事件触发

触发 drain 事件,执行 ondrain()

每个 drain 事件触发时,都会减少 awaitDrain,直到 awaitDrain 为 0。此时,调用 flow(src),使 Readable 进入 flow 模式

到这里,整个数据传递循环已经建立,数据会顺着循环源源不断的流入 Writable,直到所有数据写入完成

unpipe

不管写入过程中是否出现错误,最后都会执行 unpipe()

Readable.prototype.unpipe() 函数会根据 state.pipes 属性和 dest 参数,选择执行策略。最后会触发 dest 的 unpipe 事件

unpipe 事件触发后,调用 onunpipe(),清理相关数据

End

在整个 pipe 的过程中,Readable 是主动方 ( 负责整个 pipe 过程:包括数据传递、unpipe 与异常处理 ),Writable 是被动方 ( 只需要触发 drain 事件 )

总结一下 pipe 的过程:

首先执行 readbable.pipe(writable),将 readable 与 writable 对接上 当 readable 中有数据时,readable.emit('data'),将数据写入 writable 如果 writable.write(chunk) 返回 false,则进入 pause 模式,等待 drain 事件触发 drain 事件全部触发后,再次进入 flow 模式,写入数据 不管数据写入完成或发生中断,最后都会调用 unpipe() unpipe() 调用 Readable.prototype.unpipe(),触发 dest 的 unpipe 事件,清理相关数据

参考:

nodejs动态创建二维码的方法 本文实例为大家分享了nodejs动态创建二维码的具体代码,供大家参考,具体内容如下!--弹出二维码--divclass="qrcode"divpid="saoma"扫描二维码/p/div/divjs代码:$.

关于在mongoose中填充外键的方法详解 本文主要给大家介绍的是关于mongoose中填充外键的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:MongoDBMongoDB是典型的N

Mongoose实现虚拟字段查询的方法详解 前言不知道大家知不知道,mongoose为数据模型提供了虚拟属性,借此可以更加一致地、方便地读写模型属性,类似于C#或Java中的访问器。我们知道虚拟属

标签: node.js import

本文链接地址:https://www.jiuchutong.com/biancheng/380929.html 转载请保留说明!

上一篇:理解nodejs的stream和pipe机制的原理和实现(nodejs dgram)

下一篇:nodejs动态创建二维码的方法(nodejs创建项目)

  • 小微企业普惠性税收减免政策2019 13号
  • 支付所得税的会计处理
  • 增值税征税范围中销售应税服务包括什么服务
  • 发票上的收款人负法律责任吗
  • 员工团体意外保险怎么报销
  • 货物运输代理费用会计分录
  • 增值税普通发票有什么用
  • 压覆矿产赔偿标准法律依据
  • 通讯费可以抵扣进项税吗
  • 快递增值税税率
  • 外汇银行会计特殊处理方法如何理解?
  • 税收分类编码如何添加
  • 财产租赁所得适用什么税率
  • 财务软件中摊销怎么做账
  • 火车票飞机票计入什么费用
  • 未分配利润期末余额怎么算出来
  • 多交的增值税可以跨年抵扣吗
  • 内部职工销售佣金计入
  • 开票收入怎么理解
  • 如何解决浏览器禁止访问
  • 什么是盈余公积和资本公积
  • 研发废料收入
  • 研发阶段产品销售账务处理
  • 稽查补交的税款怎么处理
  • php基于正则批量输出
  • js文件格式化工具
  • 理财收益如何计税
  • pytorch卷积操作
  • 园林绿化工程公司排名
  • 微擎框架可以干什么
  • macps字体怎么导入
  • 防洪保安资金可以抵扣个税吗
  • 贸易企业开发下游业务
  • 农民专业合作社法
  • 离职员工的个税忘记申报了补申报会被处罚吗
  • 罚款记入其他应收款科目
  • 结转应交税金的分录
  • 合营企业和联营企业都是权益法吗
  • 房地产企业根据什么交增值税
  • 应交税费企业所得税科目
  • 体检费用需要缴哪些费用
  • 法人一直把公户账户转账
  • 企业所得税退税会计分录
  • 应交税费余额是什么意思
  • 计提固定资产折旧账务处理
  • 银行汇票的账务处理例题
  • 发表文章开什么发票
  • 股份支付应如何进行账务处理?
  • 租房期间损坏应赔偿多少
  • 利润分享并购方法有哪些
  • 未达到起征点的增值税怎么填写
  • 未使用的固定资产计提折旧应当计入
  • 结存成本会计分录
  • Centos 7.3下SQL Server安装配置方法图文教程
  • sqlserver中存储过程
  • sql面试题50题
  • mysql查询两个表的数据
  • 关于植物的现代诗
  • 新装的ubuntu18没有网络
  • macos rootless
  • gamebar.exe是什么进程
  • win8系统如何分区
  • Linux系统中的pycharm怎么打开
  • linux下nanosleep() & sleep()的区别
  • 怎么修改抖音号
  • windos8怎么样
  • neoDVDstd.exe - neoDVDstd是什么进程 有什么用
  • win7无线网络开关在哪里
  • win7弹出cmd窗口瞬间消失
  • unity开发游戏教程
  • Javascript之BOM(window对象)详解
  • Node.js Sequelize如何实现数据库的读写分离
  • 编写批处理
  • DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
  • js面向对象写法
  • javascript面向对象 第三方类库
  • express常用api
  • 矿产资源税的计税依据
  • 合肥新房商铺
  • 什么督导组词
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号