位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享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创建项目)

  • 非税收入未上缴
  • 劳务发票要交多少税费
  • 企业一般会涉及哪些行业
  • 废品销售是否缴纳增值税
  • 营业外收入是否属于当期损益
  • 什么软件属于无线网卡
  • 代订机票被骗可以追回吗
  • 增值税专用发票抵扣税额是什么意思
  • 如何去办理小型微利企业资格每年都需要认证吗?
  • 营改增后怎么计算税费
  • 无形资产使用费计入什么科目
  • 外购货物准予抵扣进项税额26万元,货物已验收入库
  • 高新技术企业如何查询
  • 工程报废及毁损如何做会计处理合适呢?
  • 装修未付款的会计分录
  • 收到福利费会计分录
  • 预付款发票可以入费用吗
  • 税控服务费全额抵扣文件
  • 春节公司发福利买什么东西
  • 自建公司什么意思
  • 同一控制下企业合并商誉
  • 代缴个税税务局奖励款怎么做账?
  • 股权激励会计处理分录和企业所得税
  • 该设备正在使用中怎么关闭u盘
  • 调整以前年度应付工资怎么调
  • 没有收入业务招待费要全额调增吗
  • 非应纳增值税项目
  • 间断性断网
  • 固定资产折旧计算方法
  • bios设置图文详解
  • 交易性金融资本
  • h5适配iphonex
  • 车辆购买保险发票未回怎么做会计分录
  • 新办公司实收资本怎么查
  • 投资收益会计准则
  • window.location.href返回值
  • php对称加密算法
  • php array合并
  • 分公司增值税可以放总公司一起缴纳吗
  • 农民专业合作社法
  • 收到专票怎么入账
  • 租金计入主营业务成本吗
  • 新租赁准则下的会计分录
  • 固定资产出售算不算收入
  • 未达起征点附加税还需要扣税嘛
  • 进销存的原理
  • 购买净资产为负数怎么办
  • 卖出看跌期权的最大损失
  • 个税申报信息怎么填
  • 管理费用应该如何分摊 dcf
  • 外购的商品赠送客人是否销售吗
  • 社保补缴收滞纳金吗
  • 发票开错是不是可以作废?
  • 出口货物不免不退
  • 工资薪酬所得税税率表最新
  • 货币资金里的其他货币资金
  • 注册资本未到位注销公司处理
  • 预收账款属于借还是贷
  • 建筑材料租赁公司
  • 投资出去的钱如何入账
  • 如何审计营业收入
  • 车辆使用费报销制度
  • 现金账务处理原则规定
  • 稳岗补贴会计分录怎么做,需要缴纳企业所得税不
  • 酒店会计科目表
  • 会计报表的主要构成内容
  • 投出业务会计分录
  • mysql停不掉
  • chrome浏览器81.0
  • macos 右键菜单
  • task host windows解决
  • xp电脑网络连接配置异常怎么办
  • win11连接win7共享打印机
  • win10系统如何更改盘符
  • 为wdcp面板的lnmp服务器添加ipv6支持的方法介绍
  • JavaScript:Array类型全面解析
  • CocoStudio textfiled 文本点击区域按背景拉伸
  • LeakCanary小记
  • 异地预缴的企业所得税带不出
  • 税务税率9个点怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设