Javascript 在加载组件之前初始化Vue.prototype
我的代码使用Vuejs中的插件功能来定义全局共享变量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
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
});