TypeScript:异步生成器

Bor*_*ard 8 javascript generator async-await typescript

我想要这样的功能:

export async function* iterateDir(dir: string) {
    let list = await fs.readdir(dir); // fs-promise implementation of readdir
    for (let file of list) {
        yield file;
    }
}
Run Code Online (Sandbox Code Playgroud)

我会用的是:

for (let file in iterateDir(dir)) {
    processFile(file);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为函数不能同时是异步和生成器.

我将如何构造代码以实现相同的目标?

  1. 如果我改变await fs.readdirto回调,我假设外部for..of循环不会等待.
  2. 如果我摆脱了生成器并且目录很大,iterateDir()将会很慢.

供参考:异步生成器功能提议

Mei*_*hes 15

TypeScript 2.3 - 跟踪问题支持此功能

它介绍了一些新类型,特别是:

interface AsyncIterable<T> {
    [Symbol.asyncIterator](): AsyncIterator<T>;
}
Run Code Online (Sandbox Code Playgroud)

但最重要的是它也介绍了 for await ... of

for await (const line of readLines(filePath)) {
  console.log(line);
}
Run Code Online (Sandbox Code Playgroud)

哪里

async function* readLines(path) {
   //await and yield ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要尝试此操作,则需要配置typescript以使其知道您具有运行时支持(将"esnext.asynciterable"添加到lib列表中),您可能需要进行填充Symbol.asyncIterator.请参阅TS2318:找不到全局类型'AsyncIterableIterator' - 异步生成器