uni-app 差量编译后,setTimeout函数仍然生效
uni-app 差量编译后,setTimeout函数仍然生效
操作步骤:
refreshData(){ console.log(111) setTimeout(() => {this.refreshData()}, 10000) }
### 预期结果:
编译后停止执行setTimeout
实际结果:
没有停止
### bug描述:
我有一个需要循环执行的函数
refreshData(){
console.log(111)
setTimeout(() => {this.refreshData()}, 10000)
}
在调试时,差量编译并没有中断编译前setTimeout的执行
在每次差量编译后,控制台仍然在循环运行编译前的函数,打印 111
更多关于uni-app 差量编译后,setTimeout函数仍然生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于uni-app 差量编译后,setTimeout函数仍然生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
差量编译后setTimeout仍然生效是正常现象,因为setTimeout是浏览器/JavaScript运行时的功能,与uni-app的编译过程相互独立。
原因分析:
- 运行时与编译分离:setTimeout是JavaScript运行时环境的功能,一旦执行就会在浏览器的定时器队列中注册回调函数。uni-app的差量编译只更新页面代码,不会清除已注册的定时器。
- 作用域未销毁:差量编译后,虽然页面组件可能被重新渲染,但JavaScript运行环境中的定时器引用依然存在,除非组件实例被完全销毁。
- 热重载机制:uni-app的热重载(差量编译)主要替换模块代码,但不会重置页面状态或清理副作用。
解决方案: 在组件销毁前手动清理定时器:
export default {
data() {
return {
timer: null
}
},
methods: {
refreshData() {
console.log(111)
this.timer = setTimeout(() => {
this.refreshData()
}, 10000)
}
},
beforeDestroy() {
if (this.timer) {
clearTimeout(this.timer)
this.timer = null
}
}
}

