变换流节点js中的回调函数

时间:2017-03-22 08:50:31

标签: javascript node.js stream transform

它是变换流节点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

问题:为什么需要回调?以及为什么程序在没有被调用时会改变行为?

2 个答案:

答案 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模块,则代码可能会中断。