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时会报错,这个是为什么
回答
文档地址 https://docs.hamibot.com/
你的代码在 resData.status 为 true 时执行 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设为null或undefined,避免重复清除。 - 考虑在网络请求未完成时再次触发新请求的问题。可以考虑在请求发出后禁用重复请求(例如使用标志位控制),或者使用
setTimeout轮询代替setInterval来避免并发请求堆积。
修复上述类型问题后,代码即可正常运行。
ℹ️ 本回答由 AI 生成,内容仅供参考