快捷搜索:  汽车  科技

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)在使用可写流时,需要使用write方法将数据写入可写流内部,数据在经过一些列的处理后,会调用_write方法或者_writev方法进行消费。如果调用end方法就预示着写入操作的结束,后续再写入是不会有任何效果的。图2图1内部处理方式和可读流一样!直接上demo:

今天是中秋节,祝大家中秋节快乐!

之前两篇文章:

  • 详解Node中Stream模块之可读流Readable(一)
  • 详解Node中Stream模块之可读流Readable(二)

主要聊了一下可读流,这篇文章说说可写流!

Writable写法

和可写流Readable一样,它也有两种初始化方式,如图1所示:

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(1)

图1

内部处理方式和可读流一样!

Writable用法

直接上demo:

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(2)

图2

在使用可写流时,需要使用write方法将数据写入可写流内部,数据在经过一些列的处理后,会调用_write方法或者_writev方法进行消费。如果调用end方法就预示着写入操作的结束,后续再写入是不会有任何效果的。

_write方法(必须重新实现)

这个方法有三个参数:

  • 第一个参数data是读入可写流内部经过处理后的数据
  • 第二个参数enc是编码方式
  • 第三个参数next是一个方法

next方法有两种调用方式:异步和同步!

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(3)

图3 简单实现

数据第一次读入,会调用_write方法进行消费,如果此时内部的next方法是异步调用的,接下来读入的数据会存入内部的缓存区,等到写入结束,再从缓存区一一取出进行消费,如果调用next方法是同步的,就不会再存入缓存区,而是调用_write方法直接消费!

end方法

end方法是读入数据结束的标志,后面再读入是不会有任何效果的!

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(4)

图4 end逻辑

校验

如果没有设置objectMode = true,写入的数据只能是字符串、buffer、Uint8Array,如果设置了对象模式,数据只要不为空就行!

write方法

写入数据

  • 第一个参数data是读入的数据
  • 第二个参数enc是编码方式,默认是utf8
  • 第三个参数是一个自定义的回调函数

对于第三个回调函数,会在next方法中执行,如图5所示,唯一例外是如果实现了_writev方法,会在消费结束后把所有传入的回调函数放在onCorkedFinish方法中一次性循环执行完。

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(5)

图5

_writev方法

此方法会把缓存区的数据一次性的返回,如图6所示,只有第一次的数据会经过_write方法消费。

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(6)

图6

drain事件

如果写入的数据长度大于或等于highWaterMark,在未调用end方法的时候,当缓存区没有数据会触发此事件。

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(7)

图7

如图7,把highWaterMark设置成了1,在数据处理结束时会触发drain事件

总结

可读流相对于可写流要简单一些,不过到目前为止我们还没有把它们两者放在一起,后面我们会介绍一个很重要的方法pipe!另外在打断点时,打印的方法诸如console,stdout也会走进Stream源码中,影响我们的判断,所以建议把代码中的一些输入输出方法都干掉!

如何读取nodejs的环境变量(详解Node中Stream模块之可写流Writable)(8)

中秋快乐

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

猜您喜欢: