You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:42:45