Node.js 转换流提前停止处理
我尝试两次扩展node.js转换流,一次是将stdin拆分为新行,另一次是交替使用小写和大写Node.js 转换流提前停止处理,node.js,Node.js,我尝试两次扩展node.js转换流,一次是将stdin拆分为新行,另一次是交替使用小写和大写 SplitLines按预期工作,但AlternateUppercase未按预期工作 index.js const{Transform}=require('stream') 类分割线扩展了变换{ _转换(块、编码、回调){ const parsed=chunk.toString().trim() const results=parsed.split('\n') 结果。forEach((行)=>{ this
SplitLines
按预期工作,但AlternateUppercase
未按预期工作
index.js
const{Transform}=require('stream')
类分割线扩展了变换{
_转换(块、编码、回调){
const parsed=chunk.toString().trim()
const results=parsed.split('\n')
结果。forEach((行)=>{
this.push(`${line}\n`)
})
}
}
类AlternateUppercase扩展了转换{
构造函数(选项){
超级(选项)
this.isEven=false
}
_转换(块、编码、回调){
const line=chunk.toString()
const changed=this.isEven?line.toUpperCase():line
this.push(`${changed}\n`)
this.isEven=!this.isEven
}
}
进程.stdin
.管道(新的拆分线())
.pipe(新的AlternateUppercase())
.管道(工艺标准)
我是如何测试的
我在终点站看到了什么
我期望看到的
如果我做错了什么导致在中,您需要调用回调
函数才能接收下一个块。这在SplitLines
函数中并不明显,因为您将整个字符串作为单个块传递。但是,当您重复执行推送操作时,SplitLines
,会发送多个块,因此需要调用回调
函数
const { Transform } = require('stream')
class SplitLines extends Transform {
_transform(chunk, encoding, callback) {
const parsed = chunk.toString().trim()
const results = parsed.split('\n')
results.forEach((line) => {
this.push(`${line}\n`)
})
}
}
class AlternateUppercase extends Transform {
constructor(options) {
super(options)
this.isEven = false
}
_transform(chunk, encoding, callback) {
const line = chunk.toString()
const altered = this.isEven ? line.toUpperCase() : line
this.push(`${altered}\n`)
callback() //must call callback to receive next chunk
this.isEven = !this.isEven
}
}
process.stdin
.pipe(new SplitLines())
.pipe(new AlternateUppercase())
.pipe(process.stdout)
产出将是:
one
TWO
three
出现多个新行是因为您在两个变压器上都\n
。要解决此问题,只需添加一次\n
,即仅在拆分行或AlternateUppercase处添加
one
TWO
three
const { Transform } = require('stream')
class SplitLines extends Transform {
_transform(chunk, encoding, callback) {
const parsed = chunk.toString().trim()
const results = parsed.split('\n')
results.forEach((line) => {
this.push(`${line}\n`)
})
}
}
class AlternateUppercase extends Transform {
constructor(options) {
super(options)
this.isEven = false
}
_transform(chunk, encoding, callback) {
const line = chunk.toString()
const altered = this.isEven ? line.toUpperCase() : line
this.push(`${altered}\n`)
callback() //must call callback to receive next chunk
this.isEven = !this.isEven
}
}
process.stdin
.pipe(new SplitLines())
.pipe(new AlternateUppercase())
.pipe(process.stdout)
one
TWO
three