上下文
在访问Typescript时,我被告知阻止调用永远不应该在异步代码中完成。
我也使用生成器,因为它们可以轻松进行目录遍历,避免耗尽堆栈空间。
但是,当我将异步代码(在本例中为readdir
)与生成器结合使用时,编译器会抱怨 yield只能在生成器中使用,这让我认为编译器所有这一切都无法将闭包,生成器和异步代码组合在一起。
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.
问题
在这种情况下,推荐的最佳做法是什么?
如果我只是考虑所有内容同步,阻止代码但是&#34; wrap&#34;是否可以。承诺里面的电话?
答案 0 :(得分:2)
你可以这样做(在回调中调用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