uni-app启动初始化执行顺序
- index.html中的script标签中的代码
- App.vue的script标签外层代码
- main.js同步代码直到app.$mount()
- App.vue中的生命周期onLaunch
- App.vue中的生命周期onShow
- App.vue中的生命周期mounted
- main.js文件中app.$mount()之后的代码
- 首页index.vue的script标签外层代码
- 首页onLoad生命周期
- 前面的异步任务谁先执行完谁继续
以上说的都是同步代码执行顺序,如果有异步代码(哪怕写了await),则进入微队列等待,主队列继续执行下一步的同步代码,微队列中的异步任务,谁先执行完谁先继续走。
如果在程序初始化中有重要数据需要在首页onLoad里使用,但是是异步获取的,就会导致首页onLoad里拿不到数据,产生错误。解决方法就是给vue原型挂载一个promise对象和一个里面的resovle方法,在App.vue中调用resolve, 首页中用async修饰onLoad,在里面await vue原型上的promise,就可以避免此类错误。
//main.js
Vue.prototype.$onLaunched = new Promise((resolve) => {
Vue.prototype.$isResolve = resolve
})
//App.vue
onLaunch() {
setTimeout(()=> {
console.log("onLaunch异步完成");
this.$isResolve()
}, 3000)
}
//index.vue
onLoad() {
await this.$onLaunched
console.log("首页onLoad");
}