Skip to content

Latest commit

 

History

History
116 lines (90 loc) · 2.4 KB

writable.md

File metadata and controls

116 lines (90 loc) · 2.4 KB

Writable

可写流的功能是作为下游,消耗上游提供的数据。

本文中用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,所有数据均已写入。

finish事件

Readableend事件类似,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事件,来判断写操作完成。