gpt4 book ai didi

node.js - promise 导入后实例化对象

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

我正在努力从动态导入的类中实例化对象。基本上我有一些看起来像这样的插件:

export interface IPlugin {
compile(logEvent: LogEventInfo): string;
}

export class DatePlugin implements IPlugin {
public compile(logEvent: LogEventInfo): string {
const date: Date = new Date();
return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
}
}

在另一个文件中我想动态爬取一个文件夹,加载所有源文件并实例化它们。我看到 import(...).then() 可以返回一个加载的对象,但在我的例子中它返回了类,我的对象创建开始看起来非常难看:

public async loadPlugins(): Promise<void> {
// ...
await Promise.all(pluginFiles.map(async (pluginFile: string): Promise<void> => {
const pluginFilePath: string = path.join(pluginsFolder, pluginFile);
import(pluginFilePath).then((plugin: any): void => {
const obj: IPlugin = (new plugin[Object.keys(plugin)[0]]() as IPlugin;
// ...
});
}));
}

有没有更好的方法在加载时实例化所有这些类?

最佳答案

import() promise 没有链接,这是一个类似于 this case 的错误这可能会导致错误处理和竞争条件问题。

mapthis case 有一个共同的潜在问题.它仅用于提供等待它们的 promise ,而不是实际值。由于 async 函数调用的目的是获取类实例,因此将 pluginFile 输入映射到 obj 输出值是合理的,如果它应该被存储然后 - 或 compile 结果,如果不是:

public async loadPlugins(): Promise<...> {
const plugins = await Promise.all(pluginFiles.map(async (pluginFile: string): Promise<IPlugin> => {
const pluginFilePath: string = path.join(pluginsFolder, pluginFile);
const pluginExports = await import(pluginFilePath);

// preferably pluginExports.default export to not rely on keys order
const Plugin: { new(): IPlugin } = Object.values(pluginExports)[0];
return new Plugin();
}));
...
}

import 在这里提供的唯一真正好处是它是面向 future 的,它可以本地在 Node.js 中与第三方<无缝地使用/em> ES 模块 (.mjs) 文件。由于 TypeScript 以任何方式使用并且在后台使用 require 进行 ES 模块导入,因此放弃异步例程并同步使用 require 而不是 import< 可能是合理的 用于动态导入:

public loadPlugins(): <...> {
const plugins = pluginFiles.map((pluginFile: string): IPlugin => {
const pluginFilePath: string = path.join(pluginsFolder, pluginFile);
const pluginExports = require(pluginFilePath);

// preferably pluginExports.default export to not rely on keys order
const Plugin: { new(): IPlugin } = Object.values(pluginExports)[0];
return new Plugin();
}));
...
}

关于node.js - promise 导入后实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50378889/

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