Node 最简单的 stream 用法就像下边这样:
const fs = require('fs')
const zlib = require('zlib')
fs.createReadStream(inputPath)
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream(outputPath))
更好的方式是使用 stream.pipeline
const stream = require('stream')
const util = require('util')
const pipeline = util.promisify(stream.pipeline)
const fs = require('fs')
const zlib = require('zlib')
await pipeline(
fs.createReadStream(inputPath),
zlib.createGzip(),
fs.createWriteStream(outputPath)
)
进一步,我们将“管道”与“运行”分离
class Runner {
constructor() {
const stream = require('stream')
const util = require('util')
this.pipeline = util.promisify(stream.pipeline)
}
register(steps) {
this.steps = steps
return this
}
run() {
return this.pipeline(...this.steps)
}
}
调用
const runner = new Runner()
const steps = [
fs.createReadStream(inputPath),
zlib.createGzip(),
fs.createWriteStream(outputPath)
]
await runner
.register(steps)
.run()