收藏
回答

关于 app.js 中的生命周期方法 onLaunch 中使用 await 的问题 ?

有如下代码

async onLaunch() {    
  console.log('[app.js - onLaunch] execute start')
  await proTest()
  await proTest2()
  console.log('[app.js - onLaunch] executed end')
}


proTest 与 proTest2 均为 Promise

proTest 使用了 setTimeout 模拟接口调用 延迟两秒

proTest2 使用了微信获取用户设备信息的 api

理想情况下应该为 onLaunch 阻塞两秒之后 再通过 proTest2 方法 将设备信息放到 storage 中 再通过 behaviors 的方式从 storage 中取出 这样页面就自带设备信息而不需要重新获取了

proTest 确实延迟了两秒 但是这期间已经开始执行页面(此处使用的 Component 替代 Page)的生命周期函数了 所以是不是可以说 虽然 app.js 中的生命周期确实先于 page 或 component 的生命周期 但这种情况下并不会等待 onLaunch 中的代码执行完毕 再执行 page 或 component 的生命周期呢 ?

另外 微信小程序 各生命周期的执行顺序(从 App 到 Page 到 Component)有文档参考吗 我没有找到 如果有的话请诸位大佬给个链接我参考参考 谢啦先~

导致的线上问题:其他 page 中有依赖 模拟接口 中返回的值 以及模拟接口之后的代码放入 storage 中的值 但是 其他 page 并没有等模拟接口执行完毕再执行 所以未获取到需要的参数 导致初次进入页面后白屏 必须手动重新刷新页面才能获取

重现方式:点击 清除缓存重新编译 如最后图片所示(务必每次都这样测试 模拟用户第一次进入小程序 或者 手动清除 storge 中的 key 也可以)

代码片段:https://developers.weixin.qq.com/s/8SacrFmn7kSv

------------------------------------------------------------------------------------------------------------------

ps: 代码片段导入的时候报错 Uncaught ReferenceError: __wxConfig is not defined

我是通过点击 不校验安全域名 勾上 再取消 或者 取消 再勾上 就不报错了 (别问我为什么 一问一个不吱声)

回答关注问题邀请回答
收藏

2 个回答

  • showms
    showms
    07-15

    这些生命周期的函数是异步执行的。如果你在page中需要获取onLaunch里面的执行结果,可以在page里面注册一个回调函数导app.js,onLaunch执行完毕后触发这个回调函数

    可以参考一下https://developers.weixin.qq.com/community/develop/article/doc/000e28e8e5cb684acb012b0b06b813

    07-15
    有用
    回复 1
    • ẅ
      发表于移动端
      07-15
      嗯嗯 帖子我看了 目前我也是采用回调的方式来解决这个问题的 🦀🦀
      07-15
      回复
  • 跨商通
    跨商通
    07-14

    执行顺序是:

    app.onLaunch()
    page.onLoad()
    
    

    两者是异步执行的。

    而不是:

    await app.onLaunch()
    await page.onLoad()
    
    07-14
    有用
    回复 1
    • ẅ
      发表于移动端
      07-15
      好嘞 收到 感谢解惑
      07-15
      回复
登录 后发表内容