超过最大调用堆栈大小 TypeScript 递归函数返回生成器返回 Promise
Maximum call stack size exceeded TypeScript Recursive Function returning a Generator returning a Promise
我有一个生成器,一次流式传输一个大文件的一行。我一次只想处理一行,文件大小可能会变得很大。
export async function *lineOfFileGenerator(fullFilePath: string) {
const filestream = createReadStream(fullFilePath);
const rl = createInterface({
input: filestream,
crlfDelay: Infinity
});
for await (const line of rl) {
yield line;
}
}
然后实例化
const gen = lineOfFileGenerator('./path/to/file')
我想继续调用这个生成器(returns 一个承诺)直到它是 'done'。因为它 returns 是一个承诺,所以我无法循环并直接检查 done 布尔值是否为真。我做了一个递归函数
function genPrinter(geno: any): void | AsyncGeneratorFunction {
geno.next().then((val: { done: boolean; value: string; }) => {
if (val.done) {
console.log('done');
return;
}
// will eventually call a processing function.
console.log(val.value);
});
return genPrinter(geno);
}
然而,我得到 RangeError: Maximum call stack size exceeded
。
我不确定如何称呼这个 generator/solve 这个问题。
递归函数期望退出某些条件。在您的情况下,您无休止地调用 genPrinter
,在这种情况下,您不需要递归函数,只需一个 await..for
循环即可完成工作。在这里我稍微重构了你的代码:
async function genPrinter(geno: any) {
for await (let val of geno) {
console.log('value:', val);
}
console.log('done');
}
如果你仍然想做同样的事情,在你的方法中试试这个:
async function genPrinter(geno: any): void | AsyncGeneratorFunction {
let { done, value } = await geno.next();
if (done) {
console.log('done');
return;
}
console.log(value);
return genPrinter(geno);
}
我有一个生成器,一次流式传输一个大文件的一行。我一次只想处理一行,文件大小可能会变得很大。
export async function *lineOfFileGenerator(fullFilePath: string) {
const filestream = createReadStream(fullFilePath);
const rl = createInterface({
input: filestream,
crlfDelay: Infinity
});
for await (const line of rl) {
yield line;
}
}
然后实例化
const gen = lineOfFileGenerator('./path/to/file')
我想继续调用这个生成器(returns 一个承诺)直到它是 'done'。因为它 returns 是一个承诺,所以我无法循环并直接检查 done 布尔值是否为真。我做了一个递归函数
function genPrinter(geno: any): void | AsyncGeneratorFunction {
geno.next().then((val: { done: boolean; value: string; }) => {
if (val.done) {
console.log('done');
return;
}
// will eventually call a processing function.
console.log(val.value);
});
return genPrinter(geno);
}
然而,我得到 RangeError: Maximum call stack size exceeded
。
我不确定如何称呼这个 generator/solve 这个问题。
递归函数期望退出某些条件。在您的情况下,您无休止地调用 genPrinter
,在这种情况下,您不需要递归函数,只需一个 await..for
循环即可完成工作。在这里我稍微重构了你的代码:
async function genPrinter(geno: any) {
for await (let val of geno) {
console.log('value:', val);
}
console.log('done');
}
如果你仍然想做同样的事情,在你的方法中试试这个:
async function genPrinter(geno: any): void | AsyncGeneratorFunction {
let { done, value } = await geno.next();
if (done) {
console.log('done');
return;
}
console.log(value);
return genPrinter(geno);
}