
在微信小程序或 uni-app 开发中,经常遇到这样的问题:当页面通过 wx.navigateTo 或 uni.navigateTo 跳转后,之前通过 setInterval 创建的定时器(如 apiInterval)仍在后台持续运行,导致不必要的性能消耗和潜在的业务逻辑错误。

setInterval 和 setTimeout 创建的定时器不会随页面跳转而自动销毁navigateTo 跳转时,原页面被推入页面栈但并未销毁onUnload 时页面才会真正卸载微信小程序示例:
Page({
data: {
apiInterval: null,
},
onLoad() {
// 启动定时器
this.data.apiInterval = setInterval(() => {
this.fetchData();
}, 5000);
},
onUnload() {
// 页面卸载时清除定时器
this.clearInterval();
},
onHide() {
// 页面隐藏时也清除(跳转到 tabBar 页面等情况)
this.clearInterval();
},
clearInterval() {
if (this.data.apiInterval) {
clearInterval(this.data.apiInterval);
this.data.apiInterval = null;
}
},
fetchData() {
console.log("调用API...");
}
});uni-app 示例:
export default {
data() {
return {
apiInterval: null,
};
},
mounted() {
this.apiInterval = setInterval(this.fetchData, 5000);
},
beforeDestroy() {
if (this.apiInterval) {
clearInterval(this.apiInterval);
this.apiInterval = null;
}
},
onHide() {
// 处理小程序端的页面隐藏
if (this.apiInterval) {
clearInterval(this.apiInterval);
this.apiInterval = null;
}
}
};为确保万无一失,建议在多个生命周期函数中都添加清除逻辑:
Page({
onHide() {
this.clearInterval();
},
onUnload() {
this.clearInterval();
},
methods: {
clearInterval() {
if (this.data.apiInterval) {
clearInterval(this.data.apiInterval);
this.data.apiInterval = null;
}
},
},
});// 在关键位置打印定时器状态
console.log("定时器ID:", this.data.apiInterval);
// 清除后验证
clearInterval(this.data.apiInterval);
console.log("清除后定时器状态:", this.data.apiInterval); // 应该为 null// 查看当前页面栈状态
console.log("当前页面栈:", getCurrentPages());Page({
// 启动定时器
startInterval(callback, delay) {
this.clearInterval();
this.data.apiInterval = setInterval(callback, delay);
return this.data.apiInterval;
},
// 清除定时器
clearInterval() {
if (this.data.apiInterval) {
clearInterval(this.data.apiInterval);
this.data.apiInterval = null;
}
},
// 带错误处理的定时器
startSafeInterval(callback, delay) {
this.clearInterval();
this.data.apiInterval = setInterval(() => {
try {
callback();
} catch (e) {
console.error("定时任务出错:", e);
this.clearInterval(); // 出错时自动清除
}
}, delay);
}
});setInterval(() => {
try {
this.fetchData();
} catch (e) {
console.error("定时任务出错:", e);
// 可根据业务需求决定是否继续执行
}
}, 5000);Q: 为什么 onUnload 有时不触发?
onHide 而非 onUnloadredirectTo 时前一个页面会触发 onUnloadonUnloadQ: 如何确保所有定时器都被清除?
data 中使用数组管理多个定时器onUnload 中遍历清除所有定时器您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。