【发布时间】:2017-03-17 07:39:14
【问题描述】:
我想要一个这样的功能:
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);
}
这不起作用,因为函数不能既是异步又是生成器。
我将如何构建代码以实现相同的目标?
- 如果我将
await fs.readdir更改为回调,我假设外部 for..of 循环不会等待。 - 如果我去掉生成器并且目录很大,
iterateDir()会很慢。
【问题讨论】:
-
如果您的异步工作在您的生成器工作之前完成,那么您可以让它们具有不同的功能。
-
重点是生成器本身需要异步(它等待文件系统操作)。
-
生成器不能是异步的(还)。您发布的代码不需要是异步生成器;它可以分为异步部分和生成器部分。
-
好吧,在我的具体情况下,
iterateDir将是递归的。对于每个file,都会检测它是否是目录,如果是,则递归调用iterateDir。在这种情况下,我不知道如何拆分异步和生成功能。这是问题的重点.. -
在这种情况下,我建议使用 observables (Rx.JS)。
标签: javascript typescript async-await generator