它是变换流节点js的一个简单例子。
代码:
const { Transform } = require('stream');
const transtream = new Transform({
transform(chunk, encoding, callback){
this.push(chunk.toString().toUpperCase());
callback()
}
});
process.stdin.pipe(transtream).pipe(process.stdout);
这很好用:
Input: hi this is me
Output: HI THIS IS ME
Input: hi this is me again
Output: HI THIS IS ME AGAIN
现在如果我不调用回调函数,这个程序就不像以前那样工作了。
新代码:
const { Transform } = require('stream');
const transtream = new Transform({
transform(chunk, encoding, callback){
this.push(chunk.toString().toUpperCase());
//callback()
}
});
process.stdin.pipe(transtream).pipe(process.stdout);
现在当我提供输入时,它第一次起作用,然后它停止转换数据。所以没有输出第二个输入。
Input: hi this is me
Output: HI THIS IS ME
Input: hi this is me again
Input: hey
问题:为什么需要回调?以及为什么程序在没有被调用时会改变行为?
答案 0 :(得分:1)
我只是复制粘贴通过2 npm模块的文档的某些部分。
通常当你想在节点js中使用流时,最好使用npm模块。
transformFunction必须具有以下签名:function(chunk,encoding,callback){}。最小的实现应调用回调函数来指示转换已完成,即使该转换意味着丢弃块。
要对新块进行排队,请调用this.push(chunk) - 如果要发送多个部分,可以在回调()之前根据需要调用多次。
或者,您可以使用回调(错误,块)作为发出单个块或错误的简写。
答案 1 :(得分:0)
将其视为ExpressJS中中间件的工作方式,如果不提供对next()的调用,则中间件不会将控制权移交给ExpressJS程序中的下一个中间件,这与回调函数的工作方式相同。如果您不调用callback()方法,则好像您尚未将该数据块的控件转移到管道中的下一个流处理程序。
如果callback()名称令人困惑,只需将其更改为next()即可,它为您提供与ExpressJS中相同的思维模型。
使用本机Stream Transforms相对于through2并没有犯罪,唯一的缺点是,如果基础节点流API发生更改而不一定影响NPM模块,则代码可能会中断。