Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换流节点js中的回调函数_Javascript_Node.js_Stream_Transform - Fatal编程技术网

Javascript 转换流节点js中的回调函数

Javascript 转换流节点js中的回调函数,javascript,node.js,stream,transform,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

这是转换流节点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 npm模块复制粘贴部分文档

通常,当您不想在NodeJS中使用流时,最好使用npm模块

transformFunction必须具有以下签名:函数(块、编码、回调){}。最小的实现应该调用回调函数来指示转换已完成,即使该转换意味着丢弃块

要对新块进行排队,请调用this.push(chunk)——如果有多个块要发送,则可以在回调()之前根据需要多次调用它


或者,您可以使用回调(err,chunk)作为发出单个块或错误的简写。

将其视为ExpressJS中中间件的工作方式,如果您不提供对next()的调用,则中间件不会将控制权移交给ExpressJS程序中的下一个中间件,这与此回调函数的工作方式相同。如果不调用callback()方法,则看起来好像没有将该数据块的控制权转移到管道中的下一个流处理程序

如果callback()名称令人困惑,只需将其更改为next(),使其提供与ExpressJS中相同的心智模型


与through2相比,使用本机流转换没有犯罪行为,唯一的缺点是,如果底层节点流API发生更改,代码可能会中断,这可能不一定会影响NPM模块。

您是否在询问为什么需要回调?您能否澄清问题是什么?回调函数是否在数据作为流读取时推送数据?