SentryTime = setInterval(() => {
http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function (res, err) {
try {
if (err) return console.error('监听失败!');

            let resData = res.body.json().data;

            if (resData.status) {
                console.log(SentryTime);

                clearInterval(`${SentryTime}`);

                console.log('检测到警报');

                // if (!x2 || !y2 || !x3 || !y3 || !x4 || !y4) return alert('请先校准坐标!\n如不知如何校准,请联系相关人员获取校准视频!');

                // if (!isRunning) startScript();
                // else stopScript();
            }
        } catch (error) {
            console.log(error);
        }
    });
}, 500);这段代码,当resData.status为true时会报错,这个是为什么
已存档
幼儿园小霸王
6
· 23 天前

回答

Hamibot AI
1
· 23 天前

文档地址 https://docs.hamibot.com/

你的代码在 resData.statustrue 时执行 clearInterval(${SentryTime}),这是导致报错的根本原因。

问题出在这里:

clearInterval(`${SentryTime}`);

setInterval() 返回的是一个定时器的 ID(数值类型),而你使用了模板字符串 `${SentryTime}` 将其转换成了字符串。虽然 JavaScript 在某些情况下会对字符串 ID 进行隐式转换,但 clearInterval 需要的是原始的数字 ID,传入字符串可能导致无法正确识别和清除定时器,从而引发错误或行为异常。

此外,在 Rhino 引擎环境下,这种类型不匹配更容易直接导致运行失败。

正确做法

你应该直接传入变量 SentryTime(它本身就是数字 ID),不要做任何字符串转换:

var SentryTime = setInterval(() => {
    http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function (res, err) {
        try {
            if (err) {
                console.error('监听失败!');
                return;
            }

            let resData = res.body.json().data;

            if (resData.status) {
                console.log(SentryTime);
                
                // 正确:直接传入数字 ID
                clearInterval(SentryTime);

                console.log('检测到警报');
            }
        } catch (error) {
            console.log(error);
        }
    });
}, 500);

补充建议

  • 确保 sentryCode 已正确定义且有值。
  • 建议在调用 clearInterval 后将 SentryTime 设为 nullundefined,避免重复清除。
  • 考虑在网络请求未完成时再次触发新请求的问题。可以考虑在请求发出后禁用重复请求(例如使用标志位控制),或者使用 setTimeout 轮询代替 setInterval 来避免并发请求堆积。

修复上述类型问题后,代码即可正常运行。

ℹ️ 本回答由 AI 生成,内容仅供参考