事件处理器设置的属性值始终无变化问题排查
问题根因
你的代码逻辑存在两个明显问题:
- 每当
setInterval触发generateActivity执行,都会重新创建一个初始值全为0的全新状态对象o。事件回调里修改的是之前函数执行时生成的旧o对象,和当前刚创建的新对象没有任何关联,所以打印结果永远显示0。 - 每1秒就会重复注册一次
keydown、mousemove事件监听器,程序运行越久,堆在内存里的监听器越多,既会造成内存泄漏,也会导致事件触发时重复执行无意义的赋值操作。
正确实现
状态对象初始化、事件监听注册只需要执行一次,不需要放进定时器回调里。定时器只需要负责每秒读取状态、按需重置状态即可:
// 初始化活动状态,仅执行一次 const activityStatus = { is_mouse: 0, is_keyboard: 0 }; // 注册全局事件监听,仅执行一次 uiohook.uIOhook.on('keydown', () => { activityStatus.is_keyboard = 1; }); uiohook.uIOhook.on('mousemove', () => { activityStatus.is_mouse = 1; }); // 每秒轮询状态 setInterval(() => { console.log(activityStatus); // 如果你的需求是统计每一秒区间内是否有对应活动,打印完成后必须重置状态 // 否则值一旦被设为1就会一直保持,后续统计会失效 activityStatus.is_mouse = 0; activityStatus.is_keyboard = 0; }, 1000);
内容的提问来源于stack exchange,提问作者Brian Millot
相关产品推荐
相关产品推荐

