首页 > 解决方案 > 如何将自定义事件添加到节点中的类?

问题描述

所以我只是拿起节点,我想知道如何将自定义事件添加到类中。下面是我尝试的代码。本质上只是创建一个简单的农场类,每次动物数量发生变化时,我都会显示新的数字。我要创建的事件是 totalChanged。

let events = require('events');

class Farm{
    constructor(totalAnimals){
        this._totalAnimals = totalAnimals;
        events.EventEmitter.call(this);
    }

    get totalAnimals(){
        return this._totalAnimals
    }

    set totalAnimals(newTotal){
        this._totalAnimals = newTotal;
    }

    sellAnimals(amount){
        this._totalAnimals -= amount;
        this.emit("totalChanged");
    }

    buyAnimals(amount){
        this._totalAnimals += amount;
        this.emit("totalChanged");
    }

    toString(){
        return "Number of animals in farm: " + this._totalAnimals;
    }
}

let testFarm = new Farm(100);
testFarm.on("totalChanged",testFarm.toString());
testFarm.buyAnimals(20);

标签: javascriptnode.jsclasseventscustom-events

解决方案


你有几个选择:

如果你想使用instance.on你必须像这样继承EventEmitter

let EventEmitter = require('events').EventEmitter

class Farm extends EventEmitter {
  constructor() {
    super()
  }

  buyAnimals() {
    this.emit('totalChanged', { value: 'foo' })
  }
}

let testFarm = new Farm()
testFarm.on('totalChanged', value => {
  console.log(value)
})

testFarm.buyAnimals()

如果您更喜欢使用组合而不是继承,您可以简单地实例EventEmitter化为属性并instance.eventEmitter.on像这样使用:

let EventEmitter = require('events').EventEmitter

class Farm {
  constructor() {
    this.eventEmitter = new EventEmitter()
  }

  buyAnimals() {
    this.eventEmitter.emit('totalChanged', { value: 'foo' })
  }
}

let testFarm = new Farm()
testFarm.eventEmitter.on('totalChanged', value => {
  console.log(value)
})

testFarm.buyAnimals()

推荐阅读