TypeScript:异步生成器 [英] TypeScript: async generator

查看:49
本文介绍了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;
    }
}

我的用法如下:

for (let file in iterateDir(dir)) {
    processFile(file);
}

这不起作用,因为一个函数不能既是异步函数又是生成器。

我如何组织代码以实现相同的目标?

  1. 如果我将await fs.readdir更改为回调,我假定外部for..of循环不会等待。
  2. 如果我去掉生成器,并且目录很大,iterateDir()会很慢。

参考:async generator function proposal

推荐答案

TypeScript2.3-tracked issue

它引入了几个新类型,值得注意的是:

interface AsyncIterable<T> {
    [Symbol.asyncIterator](): AsyncIterator<T>;
}

但最重要的是,它还引入了for await ... of

for await (const line of readLines(filePath)) {
  console.log(line);
}

其中

async function* readLines(path) {
   //await and yield ...
}
请注意,如果您想尝试这一点,您将需要配置TypeScript,让它知道您拥有运行时支持(将"esnext.asynciterable"添加到lib列表),您可能需要PolyFillSymbol.asyncIterator。请参见TS2318: Cannot find global type 'AsyncIterableIterator' - async generator

这篇关于TypeScript:异步生成器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆