Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在加载组件之前初始化Vue.prototype_Javascript_Vue.js_Promise - Fatal编程技术网

Javascript 在加载组件之前初始化Vue.prototype

Javascript 在加载组件之前初始化Vue.prototype,javascript,vue.js,promise,Javascript,Vue.js,Promise,我的代码使用Vuejs中的插件功能来定义全局共享变量 Vue.use(shared) 共享的定义如下:- export const shared = { config: getAppConfig() } shared.install = function() { Object.defineProperty(Vue.prototype, '$shared', { get() { return shared } }) } function getAppCo

我的代码使用Vuejs中的插件功能来定义全局共享变量

Vue.use(shared)
共享
的定义如下:-

export const shared = {
  config: getAppConfig()
}
shared.install = function() {
  Object.defineProperty(Vue.prototype, '$shared', {
    get() {
      return shared
    }
  })
}

function getAppConfig() {
  var api = getAPIURL()
  return axios.get("https://url/get_config")
  .then(response => {
    return response.data
  }
}
我的问题是,在我的组件中,如果我使用这个变量
this.$shared.config
,我会得到
未定义的

查看控制台窗口和调试语句,我的组件代码是在插件到达
this.$shared.config
之前执行的

我是javascript+Vuejs新手,但当我研究这个错误时,它与axios是异步的有关,所以我决定返回promise并使用Wait

function getAppConfig() {
  var api = getAPIURL()
  return axios.get("https://url/get_config")
}
但是,在我的
shared.install
功能中,我尝试执行以下操作:-

shared.install = function() {
  let config = await shared.config
我得到错误:
语法错误:wait是一个保留字


因为我是新来的,看起来我在如何使代码同步方面犯了一个基本错误。解决这个问题的正确方法是什么?

Vue并不特别支持异步初始化的插件

如果组件将在
Vue.use(shared)
之后立即实例化,
$shared
将不可用。应存在可链接的承诺,例如:

install() {
  Vue.sharedPromise = getAppConfig();
  Vue.sharedPromise.then(config => {
    Vue.prototype.$shared = config
  });
}

由于没有必要将异步操作推送到插件,因此可以将其保存在外部:

install(Vue, { config }) {
  Vue.prototype.$shared = config;
}


如果应用程序配置非常重要,也许您应该延迟实例化VueJS应用程序,直到收到来自端点的响应为止?
函数getAppConfig
不会返回任何内容,因此结果是
未定义
-问题二,
await
只能用于
async
的函数中……问题三:如何使此代码同步?您不能。异步结果不能同步,除非您将检索结果的方式更改为同步-并且同步XMLHttpRequest已被弃用,并导致用户体验不佳-即您如何在组件中使用此数据,也许help@JaromandaX我有一个用例,我的应用配置只能通过HTTP请求获取。安装新插件是唯一的方法吗?谢谢你的回答。我将以这种方式实施。感谢您建议推荐的方法,并解释为什么它不能以这种方式工作。你能解释一下这种方法是不是很不受欢迎吗?确实如此$当安装组件时,共享将不可用,并且您不知道它何时可用,因为它不是被动的。它工作的唯一方法是使用巨大的setTimeout,并希望它在延迟后可用。如果出于某种原因执行异步初始化,至少要确保公开一个承诺,该承诺可以链接到依赖于初始化的位置。如果您有initPromise(在Vue.prototype上导入或公开),则需要在每个相关位置执行
async mounted(){await initPromise;…}
。例如,请参见这里的
auth0ClientPromise
,这与您的情况类似,但OP选择在启动后完成init,因为它对于auth令牌是可接受的(但对于像$shared这样的应用程序范围的配置可能不是)。感谢您的帮助
install(Vue, { config }) {
  Vue.prototype.$shared = config;
}
getAppConfig().then(config => {
  Vue.use(shared, { config });
  // $shared is available, mount app
});