如何向module.exports导出的USB检测模块传递回调函数?
如何向USB检测模块传递回调函数?
我编写了一段通过
module.exports导出的USB检测代码,希望在USB设备事件(添加等)触发时传入自定义的回调函数。代码如下:module.exports = class USBDetection { constructor() { this.usb = require('usb'); this.usbDetect = require('usb-detection'); } startMonitoringDevices() { this.usbDetect.startMonitoring(); // Detect add/insert this.usbDetect.on('add', function(device) { callback('add', device); }); this.usbDetect.on('add:vid', function(device) { callback('add', device); }); this.usbDetect.on('add:vid:pid', function(device) { callback('add', device); }); } };请问如何向该模块传递回调函数?
这里有几种实用的实现方式,你可以根据自己的场景选择:
方案1:构造函数传入回调(最直接)
把回调函数作为类实例的属性保存,事件触发时直接调用它。这种方式适合初始化时就确定回调逻辑的场景。
修改后的类代码:
module.exports = class USBDetection { constructor(callback) { this.usb = require('usb'); this.usbDetect = require('usb-detection'); // 把回调存为实例属性 this.deviceCallback = callback; } startMonitoringDevices() { this.usbDetect.startMonitoring(); // 使用箭头函数保证this指向当前类实例 this.usbDetect.on('add', (device) => { this.deviceCallback('add', device); }); this.usbDetect.on('add:vid', (device) => { this.deviceCallback('add', device); }); this.usbDetect.on('add:vid:pid', (device) => { this.deviceCallback('add', device); }); } };
使用示例:
const USBDetection = require('./你的模块路径'); // 定义自己的回调逻辑 const myDeviceCallback = (eventType, device) => { console.log(`设备${eventType}事件触发,设备信息:`, device); }; // 实例化时传入回调 const usbDetector = new USBDetection(myDeviceCallback); usbDetector.startMonitoringDevices();
方案2:启动方法传入回调(灵活初始化)
如果不想在构造时就绑定回调,可以把回调作为startMonitoringDevices方法的参数传入,适合需要动态决定回调的场景。
修改后的类代码:
module.exports = class USBDetection { constructor() { this.usb = require('usb'); this.usbDetect = require('usb-detection'); } startMonitoringDevices(callback) { this.usbDetect.startMonitoring(); this.usbDetect.on('add', (device) => { callback('add', device); }); this.usbDetect.on('add:vid', (device) => { callback('add', device); }); this.usbDetect.on('add:vid:pid', (device) => { callback('add', device); }); } };
使用示例:
const USBDetection = require('./你的模块路径'); const usbDetector = new USBDetection(); // 启动监控时再传入回调 usbDetector.startMonitoringDevices((eventType, device) => { console.log(`捕获设备事件:${eventType}`, device); });
方案3:动态设置回调(最高灵活性)
如果需要在运行过程中随时修改回调逻辑,可以添加一个专门的方法来更新回调,同时加上存在性检查避免报错。
修改后的类代码:
module.exports = class USBDetection { constructor() { this.usb = require('usb'); this.usbDetect = require('usb-detection'); this.deviceCallback = null; // 初始化回调为null } // 新增设置回调的方法 setDeviceCallback(callback) { this.deviceCallback = callback; } startMonitoringDevices() { this.usbDetect.startMonitoring(); this.usbDetect.on('add', (device) => { // 先检查回调是否存在,避免未设置时报错 if (this.deviceCallback) { this.deviceCallback('add', device); } }); this.usbDetect.on('add:vid', (device) => { if (this.deviceCallback) { this.deviceCallback('add', device); } }); this.usbDetect.on('add:vid:pid', (device) => { if (this.deviceCallback) { this.deviceCallback('add', device); } }); } };
使用示例:
const USBDetection = require('./你的模块路径'); const usbDetector = new USBDetection(); // 先设置初始回调 usbDetector.setDeviceCallback((eventType, device) => { console.log(`初始回调:设备${eventType}`, device); }); usbDetector.startMonitoringDevices(); // 5秒后修改回调逻辑 setTimeout(() => { usbDetector.setDeviceCallback((eventType, device) => { console.log('更新后的回调:', eventType, device.vendorId, device.productId); }); }, 5000);
小提示
- 一定要用箭头函数
() => {}或者手动绑定this,不然回调里的this会指向usbDetect实例而不是你的USBDetection类实例,导致找不到回调属性。 - 添加回调存在性检查可以避免程序因为未设置回调而崩溃,提升代码健壮性。
内容的提问来源于stack exchange,提问作者JAN
相关产品推荐
相关产品推荐

