微信小程序中 wx.onAppShow 和 App.onShow 触发时机

1,242 阅读2分钟

需求:

我们知道,小程序有 App 的生命周期,Page 的生命周期。其中通常来说,我们需要把代码写在 App.onLaunch 或者 App.onShow 中。
微信小程序提供了 App.onShow 和 wx.onAppShow 来触发小程序显示时候的回调。
本文主要通过测试,给出微信小程序在以下场景下的调用时机

  • App.onShow
  • wx.onAppShow
  • setTimout(wx.onAppShow )

测试 case

case 1 正常执行

`wx.onAppShow((result) => { console.log('wx-onapp-show') })

setTimeout(function(){
wx.onAppShow((result) => { console.log('wx-onapp-show-timeout') }) },10)

App({ onShow(){ console.log('app-onshow') } }) console.log('end')`

如上代码结果如下:

  1. app-onshow
  2. end
  3. wx-onapp-show
  4. wx-onapp-show-timeout(不稳定有)
  5. index---page-load---

从这个案例,我们看到,如果写了 App 的回调是先执行的。
App 回调(按照代码顺序执行) > wx 回调(异步不按照代码顺序) > setTimeout回调 (10 ms 延迟也可以执行,50ms就不稳定能不能执行了)
也就是说,

  • App 内的回调是立即执行的
  • wx 的回调,在一定延迟后(延迟不能过大,50ms不稳定),还会再次执行

case2 延迟执行

`wx.onAppShow((result) => { console.log('wx-onapp-show') })

setTimeout(function(){
wx.onAppShow((result) => { console.log('wx-onapp-show-timeout') }) },10)

var option = { onShow(){ console.log('app-onshow') } }; setTimeout(function(){ App(option); },10);

console.log('end')`

setTimout App 的延迟 10ms,如上代码结果如下两种情况:

  1. end
  2. app-onshow
  3. wx-onapp-show
  4. wx-onapp-show-timeout(不稳定有)
  5. index---page-load---

或者

  1. end
  2. wx-onapp-show
  3. wx-onapp-show-timeout(不稳定有)
  4. index---page-load---
  5. app-onshow

从上面结果我们发现,加了延迟之后,App 的 onsShow 回调的顺序不稳定,但肯定执行。wx 的onAppShow 做了延迟后,不稳定可能会丢失。 所以得出如下结论:

  • App() 被延迟执行后,回调始终会执行
  • App() 被延迟后,回调的执行顺序可能比同步写的 wx.onAppShow,Page.onLoad 还要快。说明这些 API 都是异步的,本身就存在一定延迟。(先执行代码 -> 存在一定延迟 -> 触发相应生命周期)
  • wx 的回调代码,如果是异步的,时机晚的话是有可能丢失的。需要尽量同步。

测试结论

微信小程序下载玩代码后,执行初期的基本渲染。然后 JSCore 线程就开始执行代码

  1. 在执行第一行代码前,App() 已经提供了。因此 App 内的 onLaunch 和 onShow 的回调是会立即执行的。
  2. wx.onAppShow 类似于 EventEmitter 这样的事件机制,事件的触发是有固定的一定延迟的,例如 20ms 。举个例子,写 3 次 有 1 ms 延迟的 wx.onAppShow ,3 者都会触发回调。但是延迟 100 ms 的话,wx.onAppShow 就不一定能触发回调,因为事件已经被触发过了。这个延迟的时间肯定有,但是多少是跟性能有关。