import()
обещания не объединены в цепочку, это ошибка, подобная в этом случае , которая может привести к проблемам с обработкой ошибок и условиями гонки.
map
имеет общую потенциальную проблему с в этом случае . Он используется только для того, чтобы давать обещания ждать их, но не для фактических значений. Поскольку целью вызова функции 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
обеспечивает здесь, это то, что он ориентирован на будущее, его можно беспрепятственно использовать изначально в Node.js с сторонними модулями 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();
}));
...
}