0

クラスにイベント リスナーを追加しようとしていますが、失敗し、オブジェクトに「on」メソッドがないことがわかります。

独自のファイル内のクラスは次のとおりです。

var events = require('events');
var util = require('util');

var Motion = function Motion (app) {

    events.EventEmitter.call(this);

    // Load models
    app.loadModel('motion', 'motion');

    this.on('testevent', function () {
        console.log('an event has happened');
    });

    this.emit('testevent');

}

util.inherits(Motion, events.EventEmitter);

module.exports = Motion;

そして、これをインスタンス化する方法は次のとおりです。

var Motion = require('./plugins/motion.js');
var motion = new Motion(app);
4

1 に答える 1

2

コンストラクター関数自体をイベント エミッターにするよう求めているようです。コードはnew、コンストラクターで生成されるオブジェクトを作成します。つまり、motionスニペットの最後に生成されるオブジェクトにはonメソッドが必要です (Vadim Baryshev が指摘しているように、これが意図されている場合、コードはそのまま動作するはずです。その場合は、この回答の残りを無視できます)。 .

コンストラクターにイベントを発行させたい場合は、この質問と私が提供した回答をご覧ください。ただし、これは優れたソリューションではなく、非標準の を使用せずにそれを行う方法はないようです__proto__

より良い解決策は、コンストラクター関数がエミッションに使用する別のイベント エミッター オブジェクトを作成することです。コンストラクターとモジュールのパターンは気に入っていますが、破棄する必要があります。多くのノードモジュールは、モジュール自体をエミッターにし、モジュールによってコンストラクターとして公開される関数を持っています。例えば:

var events = require('events');
var util = require('util');

exports = module.exports = new events.EventEmitter();

exports.Motion = function (app) {
    // Load models
    app.loadModel('motion', 'motion');

    // Emit event
    exports.emit('testevent');
};

インスタンス化するには:

var motion = require('./plugins/motion');

motion.on('testevent', function () {
    console.log('an object was constructed');
});

var motionObj = new motion.Motion(app);
于 2012-12-30T18:18:05.910 に答える