gpt4 book ai didi

node.js - 无法使用 Typescript 中的生成器编译异步代码

转载 作者:搜寻专家 更新时间:2023-10-30 21:40:32 24 4
gpt4 key购买 nike

上下文

  1. 在我使用 Typescript 的过程中,有人建议我永远不要在异步代码中进行阻塞调用

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

但是,当我将异步代码(在本例中为: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.

问题

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

如果我简单地考虑所有同步、阻塞代码但将调用“包装”在 Promise 中,是否可以?

最佳答案

你可以这样做(在回调中调用 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

关于node.js - 无法使用 Typescript 中的生成器编译异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41810518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com