0

現在、次の形式の Node.js モジュールがあります。

var events = require('events');
var emitter = new events.EventEmitter();

function emitSomething() {
    emitter.emit("event");
}
exports.emitSomething = emitSomething;
exports.on = emitter.on;

ただし、onを呼び出しても、登録されたコールバックは呼び出されませんemitSomething

最後の行を次のように変更することで、これを回避できます。

exports.on = function(event, callback) { emitter.on(event, callback); };

on 関数を別のモジュールで定義された関数にデリゲートできない理由はありますか?

4

1 に答える 1

4

これはよくある JS の間違いです。onメソッドが依存することに注意してくださいthis(これはemitterあなたの例にあります)。ただし、エクスポートするのは関数自体だけなので、emitter後で呼び出すとそのコンテキスト ( ) が失われます。

この問題の小さな例を次に示します。

var someObj = { 
    doSth: function() { console.log(this) } 
};
someObj.doSth(); // "Object { ..."

var doSth = someObj.doSth;
doSth(); // "Window { ..."

doSthのメソッドとして呼び出すと、期待どおりsomeObjthis参照someObjされます。doSth関数をにコピーした後this、新しいコンテキストを参照し、ブラウザでグローバル コンテキストを参照しますWindow。これがあなたの場合に起こります。

すでに述べたように、emitterコンテキストを関数にバインドする必要があります。これは、次のようにして行うこともできます。

exports.on = emitter.on.bind(emitter);
于 2013-04-13T15:35:59.500 に答える