鸿蒙之setTimeout问题
鸿蒙之setTimeout问题
- 现象
- 排查
- 日志打印
- 可能被取消的原因
- 解决方式
现象
setTimeout(() => {//延时后业务逻辑}, 500)
setTimeout箭头函数里面,延时后业务逻辑不执行,导致出现业务bug
排查
日志打印
hdc shell hilog -b d
使用上面日志开启debug开关,然后再搜索下日志“SetTimeoutInnerCore function call before libuv”和 “Timer has been successfully deleted.TimerID”
开启日志并打印,发现会执行Timer has been successfully deleted.TimerID,代表setTimeout被取消,打印TimerID,发现为0,为什么是0,由于场景比较特殊这个setTimeout是项目中第一个setTimeout,经确认TimerID是从0开始累加
可能被取消的原因
clearInterval()
clearTimeout()
发现有其他地方TimerID默认值不规范,例如初始化为0或者在最后清空时候未做判断,导致被取消
解决方式
过度方式在第一个setTimeout前在写一个,防止被其他地方误删除
setTimeout(()=>{},0)
建议方案在每一处clearInterval或者clearTimeout地方,需要判空处理
if (this.timerId) {
clearTimeout(this.timerId)
}