我刚刚开始学习 Node 中的流。我在内存中有一个字符串,我想将其放入应用转换的流中,并将其通过管道传输到 process.stdout。这是我的尝试:
var through = require('through');
var stream = through(function write(data) {
this.push(data.toUpperCase());
});
stream.push('asdf');
stream.pipe(process.stdout);
stream.end();
它不起作用。当我通过 Node 在 cli 上运行脚本时,没有任何内容发送到 stdout,也不会引发任何错误。我有几个问题:
- 如果您想将内存中的值放入流中,最好的方法是什么?
推送
和队列
有什么区别?
- 在调用
pipe()
之前或之后调用 end()
有什么关系吗?
end()
等同于 push(null)
吗?
谢谢!
只需使用普通流 API
var Transform = require("stream").Transform;
// create a new Transform stream
var stream = new Transform({
decodeStrings: false,
encoding: "ascii"
});
// implement the _transform method
stream._transform = function _transform(str, enc, done) {
this.push(str.toUpperCase() + "\n";
done();
};
// connect to stdout
stream.pipe(process.stdout);
// write some stuff to the stream
stream.write("hello!");
stream.write("world!");
// output
// HELLO!
// WORLD!
<小时/>
或者您可以构建自己的流构造函数。这确实是流 API 的使用方式
var Transform = require("stream").Transform;
function MyStream() {
// call Transform constructor with `this` context
// {decodeStrings: false} keeps data as `string` type instead of `Buffer`
// {encoding: "ascii"} sets the encoding for our strings
Transform.call(this, {decodeStrings: false, encoding: "ascii"});
// our function to do "work"
function _transform(str, encoding, done) {
this.push(str.toUpperCase() + "\n");
done();
}
// export our function
this._transform = _transform;
}
// extend the Transform.prototype to your constructor
MyStream.prototype = Object.create(Transform.prototype, {
constructor: {
value: MyStream
}
});
现在像这样使用它
// instantiate
var a = new MyStream();
// pipe to a destination
a.pipe(process.stdout);
// write data
a.write("hello!");
a.write("world!");
输出
HELLO!
WORLD!
<小时/>
关于 .push
与 .write
的其他一些注意事项。
.write(str)
将数据添加到可写缓冲区。它的意思是外部调用。如果您将流视为双工文件句柄,那么它就像 fwrite
一样,只是进行了缓冲。
.push(str)
将数据添加到可读缓冲区。它只能从我们的流中调用。
.push(str)
可以被调用多次。看看如果我们将函数更改为会发生什么
function _transform(str, encoding, done) {
this.push(str.toUpperCase());
this.push(str.toUpperCase());
this.push(str.toUpperCase() + "\n");
done();
}
输出
HELLO!HELLO!HELLO!
WORLD!WORLD!WORLD!
我是一名优秀的程序员,十分优秀!