Javascript Node.JS--需要了解本机流的帮助吗

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

我试图了解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.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');
});

非常感谢。我想我现在明白了。