位置: 编程技术 - 正文

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创建项目)

  • 增值税发票税控开票软件
  • 一般纳税人开普票税率是3%还是13%
  • 普通增值税有什么用
  • 实收资本资本公积盈余公积均属于投资者投入企业的资本
  • 研发费用资本化支出
  • 企业应收款包括
  • 纳税人如何办理纳税申报流程
  • 已交增值税如何做账
  • 房租怎么抵扣个税计算方法
  • 增值税专票劳务费怎么开
  • 建筑面积包括分摊建筑面积吗
  • 与其他企业联营算投资吗
  • 租赁汽车油费可以抵扣吗
  • 对方增值税发票丢失怎么办
  • 业务招待费的进项可以抵扣吗
  • 退货专票已经认证进项税怎么处理
  • 怎么查找使用手机的时间
  • 幼儿园是否缴纳残疾人保障金
  • 运输发票的税率有几种
  • 研发费用的
  • 对方公司税务注销了发票没有开给我怎么办
  • 如何代开外籍人员个人所得税完税凭证?
  • 收到的投资收益属于经营活动产生的现金流量吗
  • 税控盘减免税款结转会计分录
  • 单位开具发票
  • 腾讯云centos5.8
  • win11安装失败0xc1900201
  • 给客户买的礼品怎么报销
  • 财务工作中如何用进销存软件
  • lsalss.exe
  • win10平板模式怎么切换
  • 电脑上fci是什么文件
  • 应交营业税计算公式
  • 微信小程序前端源码
  • word下划线怎么延长
  • 现金支票提取备用金会计处理
  • 商誉准则最新修订时间
  • 简单谈谈php中的安全性
  • 一台电脑能不能接两个键盘
  • 出口退税无纸化备案怎么弄
  • php获取年月日
  • vue项目中技巧知识点
  • vue3.0用法
  • accubattery准确性
  • vue.mixin是什么
  • php二维数组foreach
  • php微信公众号 全站模板
  • php设置标题
  • 合同价格约定不明法律规定
  • 年报数据和四季度数据一样吗
  • 个人销售商品交什么税
  • 企业购买理财产品收益要交税吗
  • 员工福利开的专票怎么做分录
  • 收购少数股东权益是利好吗
  • 车辆使用费怎么算
  • 跨月发票红冲怎么做账务处理
  • 印花税根据一个月的销售额来计提吗
  • 购货方收到销售折扣发票怎么入账
  • 应交税费应交增值税减免税款
  • 本期已认证且不抵扣怎么申报
  • 税金及附加有啥
  • 咨询服务费如何合理避税
  • mysql8.0环境配置
  • 用SQL统计SQLServe表存储空间大小的代码
  • win传统桌面
  • 萝卜家园和番茄花园哪个好
  • cortanawin10在哪
  • 简述在windows中创建用户的步骤
  • flash 3 utility
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • shell按行读取文件存入数组
  • js启动
  • jquery使用css
  • jquery全选和全不选效果
  • 河南省地方税务局房产税管理办法
  • 普通发票开具系统
  • 金税盘显示证书口令错误
  • 税控盘如何下载驱动程序及安全控件
  • 岗位练兵的作用
  • 沈阳税务局营业时间查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设