Javascript/Typescript从异步函数调用将默认常量导出为值
我读了很多书,但还没有找到有效的解决办法 我见过的最接近的是这里: 请记住,我想要导出一个对象,该对象是异步函数的结果,而不是导出异步函数定义本身 以下是我到目前为止的用例和实现:Javascript/Typescript从异步函数调用将默认常量导出为值,javascript,typescript,asynchronous,async-await,export,Javascript,Typescript,Asynchronous,Async Await,Export,我读了很多书,但还没有找到有效的解决办法 我见过的最接近的是这里: 请记住,我想要导出一个对象,该对象是异步函数的结果,而不是导出异步函数定义本身 以下是我到目前为止的用例和实现: 我们有一个名为config.ts的文件 传统上,config.ts包含一个具有相关运行时配置的对象作为默认导出 这让我们只需从“../config”或任何东西导入配置 我们的配置和秘密管理变得更加复杂,因此需要对各种秘密存储库(aws、azure等)进行各种调用 我已将config.ts重构为如下所示: 其中
导入配置
getSecret
是进行任意异步调用的函数
我导出上面的基本值是因为我有一些配置设置,这些设置是在getSecret中进行调用所必需的
通过像这样导出基本值,我可以通过一个简单的const basicConfig=require('../config').basicValues
获得这些值。通过这种方式,我们可以继续在一个干净的、集中的、经过测试的文件中管理所有有趣的配置内容,但仍然可以很早使用这些值,并避免周期性依赖
总之,这感觉应该是可行的
我尝试过很多其他的模式,但这感觉最自然和直观的阅读
下面是不好的部分:
从“../config”导入配置
生成未定义的,带有导出默认buildConfig()
export default basicValues
将按预期为我们提供配置对象(但显然没有填充异步值)await
等待它被填充:
import buildConfigProm from '../config';
const config = await buildConfigProm;
如果您不在节点中,则不支持顶级wait
。您可以调用。然后
在Promise导入的任何地方:
buildConfigProm.then((config) => {
// put all the module's code in here
});
如果您不喜欢,唯一真正的替代方法是使用依赖项注入。让您的模块导出以config
为参数的函数,例如:
// useConfig.ts
export default (config: Config) => {
console.log('color2', config.color2);
};
这样,唯一必须是异步的是入口点,它等待承诺解析,然后用它调用所需的模块:
// index.ts
import buildConfigProm from './config';
import useConfig from './useConfig';
buildConfigProm
.then((config) => {
useConfig(config);
})
.catch(handleErrors);
完全正确。我认为还值得一提的是,这与问题本身在标题和内容中提出的
导出
与导出默认值
无关。我在哪里可以添加我最终采用的实现的回顾?@zentechinc Retrieval,你是什么意思?
// index.ts
import buildConfigProm from './config';
import useConfig from './useConfig';
buildConfigProm
.then((config) => {
useConfig(config);
})
.catch(handleErrors);