鸿蒙之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)
}

猜你喜欢

转载自blog.csdn.net/f917386389/article/details/142515174