需求:
我们知道,小程序有 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')`
如上代码结果如下:
- app-onshow
- end
- wx-onapp-show
- wx-onapp-show-timeout(不稳定有)
- 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,如上代码结果如下两种情况:
- end
- app-onshow
- wx-onapp-show
- wx-onapp-show-timeout(不稳定有)
- index---page-load---
或者
- end
- wx-onapp-show
- wx-onapp-show-timeout(不稳定有)
- index---page-load---
- app-onshow
从上面结果我们发现,加了延迟之后,App 的 onsShow 回调的顺序不稳定,但肯定执行。wx 的onAppShow 做了延迟后,不稳定可能会丢失。 所以得出如下结论:
- App() 被延迟执行后,回调始终会执行
- App() 被延迟后,回调的执行顺序可能比同步写的 wx.onAppShow,Page.onLoad 还要快。说明这些 API 都是异步的,本身就存在一定延迟。(先执行代码 -> 存在一定延迟 -> 触发相应生命周期)
- wx 的回调代码,如果是异步的,时机晚的话是有可能丢失的。需要尽量同步。
测试结论
微信小程序下载玩代码后,执行初期的基本渲染。然后 JSCore 线程就开始执行代码
- 在执行第一行代码前,App() 已经提供了。因此 App 内的 onLaunch 和 onShow 的回调是会立即执行的。
- wx.onAppShow 类似于 EventEmitter 这样的事件机制,事件的触发是有固定的一定延迟的,例如 20ms 。举个例子,写 3 次 有 1 ms 延迟的 wx.onAppShow ,3 者都会触发回调。但是延迟 100 ms 的话,wx.onAppShow 就不一定能触发回调,因为事件已经被触发过了。这个延迟的时间肯定有,但是多少是跟性能有关。