uni-app 4.33版本clearInterval(timer)后定时器依然执行

发布于 1周前 作者 caililin 来自 Uni-App

uni-app 4.33版本clearInterval(timer)后定时器依然执行

示例代码:

4.33版本clearInterval(timer)后依然定时器依然执行

操作步骤:

4.33版本clearInterval(timer)后依然定时器依然执行

预期结果:

4.33版本clearInterval(timer)后不执行

实际结果:

4.33版本clearInterval(timer)后依然定时器依然执行

bug描述:

4.33版本clearInterval(timer)后依然定时器依然执行

开发环境 版本号 项目创建方式
PC开发环境操作系统 Windows HBuilderX
PC开发环境版本号 win10
手机系统 HarmonyOS NEXT
手机系统版本号 HarmonyOS NEXT Developer Beta2
手机厂商 华为
手机机型 mate60
页面类型 vue
vue版本 vue3
打包方式 云端

3 回复

你编译产物里面的oh-package.json5的文件内容发出来看一下


已解决,oh-package.json5不是2.3.15

在uni-app 4.33版本中,如果遇到 clearInterval(timer) 后定时器依然执行的问题,这通常意味着 timer 变量可能没有正确引用到 setInterval 返回的标识符,或者存在作用域问题。以下是一些可能的代码示例和排查方法:

示例代码

正确使用 setIntervalclearInterval

Page({
    data: {
        counter: 0
    },
    onLoad: function() {
        let self = this;
        let timer = setInterval(function() {
            self.setData({
                counter: self.data.counter + 1
            });
        }, 1000);

        // 假设在某个条件下需要清除定时器
        setTimeout(function() {
            clearInterval(timer);
            console.log('Timer cleared');
        }, 5000); // 5秒后清除定时器
    }
});

在这个例子中,timer 变量正确地引用了 setInterval 返回的标识符,并在5秒后通过 clearInterval(timer) 成功清除。

排查作用域问题

如果 timer 变量在函数内部定义,确保它在需要清除时仍然可访问。例如,避免在回调函数中重新定义 timer

// 错误示例:在回调中重新定义 timer
Page({
    data: {
        counter: 0
    },
    onLoad: function() {
        let self = this;
        setInterval(function() {
            let timer = setInterval(function() { // 这里重新定义了 timer
                self.setData({
                    counter: self.data.counter + 1
                });
            }, 1000);
        }, 0);

        // 这里的 clearInterval 将无法找到正确的 timer 标识符
        setTimeout(function() {
            clearInterval(timer); // timer 未定义
        }, 5000);
    }
});

解决方案

  1. 确保 timer 变量在正确的作用域内定义:通常,将 timer 定义在页面的 data 属性中或使用 letconst 在页面方法外部定义。

  2. 检查是否有多个 setInterval 调用:如果有多个 setInterval 调用,确保清除的是正确的那个。

  3. 使用箭头函数保持 this 上下文:在 setInterval 的回调中使用箭头函数可以避免 this 指向问题。

Page({
    data: {
        counter: 0,
        timer: null
    },
    onLoad: function() {
        let self = this;
        this.data.timer = setInterval(() => {
            self.setData({
                counter: self.data.counter + 1
            });
        }, 1000);

        setTimeout(() => {
            clearInterval(this.data.timer);
            console.log('Timer cleared');
        }, 5000);
    }
});

通过上述方法,你应该能够解决 clearInterval(timer) 后定时器依然执行的问题。如果问题依旧存在,请检查是否有其他代码逻辑错误或异步操作影响。

回到顶部