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