超过最大调用堆栈大小 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);
}