返回

彻底理解微信小程序onLaunch和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()方法。

这种情况可能会导致一些问题。例如,如果在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()方法中获取到的授权信息了。