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重构为如下所示: 其中

我读了很多书,但还没有找到有效的解决办法

我见过的最接近的是这里:

请记住,我想要导出一个对象,该对象是异步函数的结果,而不是导出异步函数定义本身

以下是我到目前为止的用例和实现:

  • 我们有一个名为config.ts的文件

  • 传统上,config.ts包含一个具有相关运行时配置的对象作为默认导出

    这让我们只需从“../config”或任何东西
    导入配置

  • 我们的配置和秘密管理变得更加复杂,因此需要对各种秘密存储库(aws、azure等)进行各种调用

  • 我已将config.ts重构为如下所示:

  • 其中
    getSecret
    是进行任意异步调用的函数

    我导出上面的基本值是因为我有一些配置设置,这些设置是在getSecret中进行调用所必需的

    通过像这样导出基本值,我可以通过一个简单的
    const basicConfig=require('../config').basicValues
    获得这些值。通过这种方式,我们可以继续在一个干净的、集中的、经过测试的文件中管理所有有趣的配置内容,但仍然可以很早使用这些值,并避免周期性依赖

    总之,这感觉应该是可行的

    我尝试过很多其他的模式,但这感觉最自然和直观的阅读

    下面是不好的部分:

  • 从“../config”导入配置
    生成未定义的,带有
    导出默认buildConfig()
  • 将导出更改为简单的
    export default basicValues
    将按预期为我们提供配置对象(但显然没有填充异步值)
  • 我到底做错了什么

    很高兴在必要时提供更多DEET

    提前谢谢

    请记住,我想要导出一个对象,该对象是异步函数的结果,而不是导出异步函数定义本身

    这是不可能的。由于该值是异步检索的,因此使用该值的所有模块必须先等待异步操作完成-这将需要导出解析为所需值的承诺

    在Node的新版本中,您可以导入Promise并使用顶级
    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);