Javascript Node.JS--需要了解本机流的帮助吗
我试图了解streams的本机实现是如何工作的。代码如下:Javascript Node.JS--需要了解本机流的帮助吗,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我试图了解streams的本机实现是如何工作的。代码如下: const Stream=require('Stream'); //定义自定义类以将数据读入流 类SourceWrapper扩展了Stream.Readable{ 构造函数(可选,内容){ 超级(opt); this.content=内容; this.len=content.length; 该指数=0; } _读(){ 设i=this.index++; 如果(i>=this.len) 这个.push(null); 否则{ this.p
const Stream=require('Stream');
//定义自定义类以将数据读入流
类SourceWrapper扩展了Stream.Readable{
构造函数(可选,内容){
超级(opt);
this.content=内容;
this.len=content.length;
该指数=0;
}
_读(){
设i=this.index++;
如果(i>=this.len)
这个.push(null);
否则{
this.push(this.content[i]);
}
}
}
//生成一些数据
常量arr=(新数组(10000000)).fill(1);
//宣布溪流
const firstStream=newsourcewrapper({objectMode:true},arr);
常量转换=(x,enc,next)=>next(未定义,x*Math.random(x,10));
const firstMapStream=new Stream.Transform({objectMode:true});
firstMapStream._transform=变换;
const secondMapStream=new Stream.Transform({objectMode:true});
secondMapStream._transform=变换;
//创建度量执行时间的承诺
const start=新日期();
新承诺((解决、拒绝)=>{
第一流
.管道(firstMapStream)
.pipe(第二地图流)
.on('finish',()=>resolve(newdate());
})
.then((end)=>console.log('execTime',end-start))代码>原因是应该有人使用绑定数据
事件侦听器从流中读取数据。我已经重写了你的代码,以清楚地理解这个问题。我还修复了跳过零索引的错误索引计数
'use strict';
const Stream = require('stream');
// define a custom class to read my data into the stream
class SourceWrapper extends Stream.Readable {
constructor(opt, content) {
super(opt);
this.content = content;
this.len = content.length;
this.index = 0;
}
_read() {
let i = this.index;
if (i >= this.len) {
this.push(null);
} else {
this.push(this.content[i]);
}
this.index++;
}
}
const transform = (x, enc, next) => next(undefined, x * Math.random(x, 10));
const transform1 = new Stream.Transform({objectMode: true});
transform1._transform = transform;
const transform2 = new Stream.Transform({objectMode: true});
transform2._transform = transform;
const write = new Stream.Writable({
objectMode: true,
write(value, enc, next) {
// Do something like writing...
next();
}
});
// generate some data
const arr = (new Array(1000000)).fill(1);
const read = new SourceWrapper({objectMode: true}, arr);
new Promise((resolve, reject) => {
read
.pipe(transform1)
.pipe(transform2)
.pipe(write)
.on('finish', () => {
resolve();
});
})
.then(() => {
console.log('Done');
});
非常感谢。我想我现在明白了。