可写流的功能是作为下游,消耗上游提供的数据。
本文中用writable来指代一个Writable实例。
与Readable类似,需要为writable实现一个_write方法,
来实现一个具体的可写流。
在写入数据(调用writable.write(data))时,
会调用_write方法来处理数据。
var Stream = require('stream')
var writable = Stream.Writable({
write: function (data, _, next) {
console.log(data)
process.nextTick(next)
},
})
writable.write('a')
writable.write('b')
writable.write('c')
writable.end()或:
var Stream = require('stream')
var writable = Stream.Writable()
writable._write = function (data, _, next) {
console.log(data)
process.nextTick(next)
}
writable.write('a')
writable.write('b')
writable.write('c')
writable.end()输出:
⌘ node example/writable.js
<Buffer 61>
<Buffer 62>
<Buffer 63>
要点
_write(data, _, next)中调用next(err)来声明“写入”操作已完成, 可以开始写入下一个数据。next的调用时机可以是异步的。- 调用
write(data)方法来往writable中写入数据。将触发_write的调用,将数据写入底层。 - 必须调用
end()方法来告诉writable,所有数据均已写入。
与Readable的end事件类似,Writable有两个事件来表示所有写入完成的状况:
var Stream = require('stream')
var writable = Stream.Writable({
write: function (data, _, next) {
console.log(data)
next()
},
})
writable.on('finish', function () {
console.log('finish')
})
writable.on('prefinish', function () {
console.log('prefinish')
})
writable.write('a', function () {
console.log('write a')
})
writable.write('b', function () {
console.log('write b')
})
writable.write('c', function () {
console.log('write c')
})
writable.end()输出:
⌘ node example/event-finish.js
<Buffer 61>
<Buffer 62>
<Buffer 63>
prefinish
write a
write b
write c
finish
prefinish事件。表示所有数据均已写入底层系统,即最后一次_write的调用,其next已被执行。此时,不会再有新的数据写入,缓存中也无积累的待写数据。finish事件。在prefinish之后,表示所有在调用write(data, cb)时传入的cb均已执行完。- 一般监听
finish事件,来判断写操作完成。