写在前面
最近一线鸿蒙应用适配工作还是很忙,周五刚从北京的国家博物馆项目离场,次周一就回到了大本营继续着元服务相关的开发(在此欢迎大家搜索国家博物馆元服务体验一下ASCF框架),在北京做ASCF相关开发前,就多次遇到过某个应用场景需要从三级页面跳回首页并切换tab下标的再进行相应赋值的场景,在大本营的一个餐饮类项目开发通用遇到我们在首页加载 了多项数据,尽管后端大佬已经做了一个综合的首页聚合接口,但架不住产品大大灵感迸发,在后端大佬拉肚子的情况下,小小移动端如何力挽狂澜,征服产品大佬呢?请听下回分解,不!下面分解。
负责首页的同学在看到这个接口数据完全可以放在后面慢慢让他以同步的方式去执行获取即可,于是这个数据就在首次安装时,时而渲染时而不渲染,这就很头疼咯,经过发现是同步的问题,有时候切换的快,这个进程就特么结束了,那边还没走完。于是加了await强行那什么,效果还是不尽然。
小技术分析
这里描述的两个场景也许你们也遇到过但是没注意,这与网络或者服务器性能也有点关系,当然跟当前鸿蒙底层机制也有点微妙关系,这里不做多的解读,因为我也没时间研究。
我和组内老大在分析排查时发现,前者应该是router跳转比较快,即执行了跳转,上个页面的进程也就结束了,所以跳转后的,上一页内的赋值和切换操作,可能也许大概是不生效了,生效了这边切换过来也不认账(这里备注一下,对于tab页面的切换我们采用了tab绑定的index做一个全局的储存,在目标页面也就是首页内监听这个index的变化来做一个函数去执行切换,有兴趣我们下期可以详聊)
怎么办呢?加setTimeout
场景一
这里拿一个从某三级页面跳转首页内封装的tab自定义界面组件,Index为0的tab菜单区,想要顺利传入一个frompage,再在接收到这个值后做一些做,
有同学可能会问哦,为啥不做路由传参frompage值
是因为首页的tab是封装在组件内,此时的生命周期函数appear和onpageshow都不执行。
那么既然全局的缓存frompage,在这里赋值了,在跳转前也能拿到,为啥跳到首页就拿不到呢?原因可能是上文的个人观点,但我们加了setTimeout就拿到了
所以在项目中,如果你在路由前后有些操作没有实现,可以使用一下延时器,给代码一丢丢时间,这里300毫秒,有些场景需要给500毫秒以上,但是有些给100毫秒甚至50毫秒就可以了
场景二
由于项目的保密性和时间关系,这里仅以上图做一个简要说明
我们开发首页的小伙伴在页面中使用if判断函数41中的结果值来判断,是否渲染这个结果,虽然前面硬性使用await掰弯了两个异步请求函数,小伙伴觉得后面两个数据可以慢慢渲染因为在页面的第二屏内,以此优化首页的渲染和请求压力,这个想法是很好的,但是我们测试的小伙伴也挺专业的,发现最后一个函数的结果有时不渲染,更有意思的是我们使用断点调试慢慢看,是有结果的,快速解开断点和直接run到手机上就不出现了,当时给到我去优化,我就想到了他漏掉了后面两个await,于是加上,还是可以复现这个bug(当然有些大佬会说这个是编程错误或失误不叫bug,暂不争论哈哈哈)
那这里我也想到了一些,需要给代码时间,setTimeout让代码飞一会的情况,于是加上了setTimeout和对应的await,他就稳定的出现了,很神奇
写在最后
也许大家觉得这篇分享中理论部分使用了很多“可能、也许”这样的词汇,理论性不强,但是移动端开发还是要以结果为导向的,底层部分我们可以慢慢分析,在项目deadline面前,通过测试麻麻与产品大大的“围追堵截”,土偏方有奇效。也欢迎大家尝试使用setTimeout 来看看实际开发中的问题是否适用。感谢看到最后然后又反手点了一个赞和关注。