【问题标题】:javascript variable outside function (with async/await)?函数外的javascript变量(带有异步/等待)?
【发布时间】:2020-07-27 03:27:01
【问题描述】:

我有以下代码由于语法错误而无法工作(在异步函数之外等待)

  1. 如何用 await 定义一个变量并导出它?

  2. 当我定义一个这样的变量并从其他文件中导入它时,该变量是只创建一次(第一次读取文件时?)还是每次导入时都创建?

代码..

import _ from 'lodash'
import remoteConfig from '@react-native-firebase/remote-config'

class RemoteConfig {
  constructor() {
    if (__DEV__) {
      //Fetch, no cache. activate
      remoteConfig().fetchAndActivate(0)
    } else {
      //Fetch, cache for 5 minutes and activate
      remoteConfig().fetchAndActivate()
    }
  }

  static async build() {
    await remoteConfig().setConfigSettings({
      minimumFetchIntervalMillis: 300000,
    })

    return new RemoteConfig()
  }

  setDefaults(defaults) {
    remoteConfig().setDefaults(defaults)
  }

  getValues(keys) {
    return _.pick(remoteConfig().getAll(), keys)
  }

  getValue(key) {
    return remoteConfig().getValue(key)
  }
}

export let firebaseConfig = await RemoteConfig.build()

我正在与import {firebaseConfig} from path/to/thefile一起使用它

【问题讨论】:

  • @yash 我认为您正在寻找使用单例模式。既然你已经在构造函数中使用了异步函数,为什么不从那里调用你的 build() 方法并导出你的类的单个实例?

标签: javascript


【解决方案1】:
  1. await 只能在async 函数中使用。无法使用await 语法导出变量。

  2. 由于无法使用await 导出,因此很难说每次都会调用RemoteConfig.build()。 如果我们假设,你写了firebaseConfig = RemoteConfig.build();。该函数将在模块评估时调用一次。

这是一个解决方法:

您可以定义一个函数来设置firebaseConfig 并在应用启动时调用它。

所以:

export let firebaseConfig;

export async function setFirebaseConfig() {
    firebaseConfig = await RemoteConfig.build();
}

这将允许您不多次调用RemoteConfig.build()firebaesConfig 也可以在没有 await 语法的情况下导出。

【讨论】:

  • 如果 OP 不希望在导入中执行函数,是否可以使用异步自调用函数来代替它?
  • RemoteConfig.build() 不会被多次评估。模块代码在导入时首次评估,然后将相同的导出返回给所有导入器。
  • 我不确定你所说的OP was not looking to execute a function in the import是什么意思
  • 我不这么认为。因为如果他从子组件中导入配置,则每次出现该组件时都会调用该函数。只需在应用程序引导时调用它就会初始化 firebaseConfig,它可以在整个应用程序中使用。
  • @eugene,只有一次。
【解决方案2】:

要完成这项工作,您必须等待"Top-level await" proposal (currently at Stage 3),它允许这样做(使用像Babel 这样的转译器,您现在可以使用它)。它将允许您使用完全相同的代码。

在此之前,唯一的方法是实现像这样导出变量以使变量的值成为一个承诺,所有进口商都必须自己等待。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2019-12-01
    • 2018-01-17
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2021-01-13
    • 2011-03-04
    相关资源
    最近更新 更多