彻底理解微信小程序onLaunch和onLoad执行顺序
2024-02-16 12:11:21
小程序的初始化流程是,当用户打开一个小程序时,系统会首先触发App.onLaunch()方法,然后才触发Page.onLoad()方法。在App.onLaunch()方法中,开发者可以进行一些全局性的初始化操作,比如获取用户授权信息、加载数据等。而在Page.onLoad()方法中,开发者可以进行一些页面相关的初始化操作,比如设置页面标题、加载页面数据等。
在正常情况下,App.onLaunch()方法会先于Page.onLoad()方法执行。但是,如果在App.onLaunch()方法中执行了一个异步操作,那么在异步操作完成之前,Page.onLoad()方法可能会被执行。
例如,如果在App.onLaunch()方法中执行了一个网络请求,那么在网络请求完成之前,Page.onLoad()方法可能会被执行。这是因为网络请求是一个异步操作,它不会阻塞主线程。当主线程执行完App.onLaunch()方法后,就会继续执行Page.onLoad()方法。
这种情况可能会导致一些问题。例如,如果在App.onLaunch()方法中获取了用户授权信息,那么在Page.onLoad()方法中就无法使用这些授权信息了。这是因为Page.onLoad()方法是在App.onLaunch()方法之前执行的,所以它无法获取到App.onLaunch()方法中获取的授权信息。
为了解决这个问题,可以在App.onLaunch()方法中使用Promise对象。Promise对象可以用来处理异步操作。当异步操作完成时,Promise对象会触发一个事件。开发者可以在这个事件中执行一些操作,比如将获取到的授权信息存储到全局变量中。
App({
onLaunch: function () {
// 获取用户授权信息
wx.getSetting({
success: (res) => {
// 将获取到的授权信息存储到全局变量中
this.globalData.authInfo = res.authSetting;
}
})
},
globalData: {
authInfo: null
}
})
在Page.onLoad()方法中,就可以使用全局变量中的授权信息了。
Page({
onLoad: function () {
// 获取全局变量中的授权信息
const authInfo = this.globalData.authInfo;
// 使用授权信息做一些事情
},
data: {
globalData: App.globalData
}
})
这样,就可以保证在Page.onLoad()方法中能够使用到App.onLaunch()方法中获取到的授权信息了。