无法在Typescript中使用生成器编译asynchronous代码

上下文

  1. 在我进入Typescript的过程中,我被告知阻止调用不应该在asynchronous代码中完成

  2. 我也使用了生成器,因为它们使目录遍历变得容易并且避免了堆栈空间的耗尽。

但是,当我将asynchronous代码(在本例中为readdir )与生成器结合使用时,编译器会抱怨yield只能在生成器中使用 ,这让我认为编译器不能将闭包,生成器和asynchronous代码组合在一起一去。

 function *yyyymmGenerator(dir: string, props: Props) { const fs = require("fs"); const yyyy = props.range.getUTCFullYear().toString(); const mm = props.range.getUTCMonth().toString(); const start = `${yyyy}-${mm}`; const files = fs.readdir(dir, function(err, files) { for (let i = 0; i < files.length; i++) { const file: string = files[i]; if (file.localeCompare(start) >= 0) { const d = `${dir}/${file}`; yield file; } } }); } error TS1163: A 'yield' expression is only allowed in a generator body. 

问题

在这种情况下推荐的最佳做法是什么?

如果我简单地考虑一切同步,阻止代码,但在承诺内“包装”呼叫,是否可以?

你可以做这样的事情(调用callback函数中的next函数):

 const gen = yyyymmGenerator(args); function callback(err, files) { if(err) return gen.throw(err); gen.next(files); // Print all files returned by the generator for(file of gen) { console.log(file); } } function *yyyymmGenerator(dir: string, props: Props) { const fs = require("fs"); const yyyy = props.range.getUTCFullYear().toString(); const mm = props.range.getUTCMonth().toString(); const start = `${yyyy}-${mm}`; const files = yield fs.readdir(dir, callback); for (let i = 0; i < files.length; i++) { const file: string = files[i]; if (file.localeCompare(start) >= 0) { const d = `${dir}/${file}`; yield file; } } } gen.next(); // Start generator