NodeJS写入数组并同时读取

时间:2017-07-17 18:34:54

标签: node.js security stream

我有一个while循环,它将大约10000个条目加载到一个数组中,然后另一个函数一次弹出一个以用作测试输入。生成和加载这10000个条目的过程需要一些时间。我正在寻找一种更异步的方法,即一旦创建了50个条目,就可以调用使用该输入的方法,同时继续生成数据直到达到10000

1 个答案:

答案 0 :(得分:0)

答案是打字稿。我们的想法是使用生成器生成测试用例(特定于es6),然后使用读取器缓冲生成的测试用例。最后,测试器由一个Transform流表示,该流测试给定它的每个数据,并抛出一些异常或忽略一个失败的测试,或者如果测试用例通过则返回一个适当的消息。只需将测试生成器(读取器)传送到测试器(转换),,并可能通过管道传输到某个输出流,以编写传递和失败的测试用例

代码(打字稿):

class InputGen<T> extends Readable {
    constructor(gen: IterableIterator<T>, count: number) {
        super({
            objectMode: true,
            highWaterMark: 50,
            read: (size?: number) => {
                if (count < 0) {
                    this.push(null);
                } else {
                    count--;
                    let testData = gen.next();
                    this.push(testData.value);
                    if (testData.done) {
                        count = -1;
                    }
                }
            }
        });
    }
}

class Tester extends Transform {
    constructor() {
        super({
            objectMode: true,
            transform: (data: any, enc: string, cb: Function) => {
                // test data
                if (/* data passes the test */!!data) {
                    cb(null, data);
                } else {
                    cb(new Error("Data did not pass the test")); // OR cb() to skip the data
                }
            }
        });
    }
}

用法:

new InputGen(function *() {
    for (let v = 0; v < 100001; v++) {
        yield v; // Some test case
    }
}(), 10000).pipe(new Tester); // pipe to an output stream if necessary