0

私は自分がやっていることはできないと思わせる単純な概念のように思えることに苦労しています。

nodejsでは、class objectA.emits('hey there') の場合、class objectB.on('hey there') は 'yo' と応答できますか?

オブジェクト A と B は、どちらも EventEmitter を拡張し、同じ nodejs アプリ内にあること以外は、互いに何の関係もありません。

この質問が以前に行われた場合は申し訳ありませんが、見つかりません。

4

1 に答える 1

2
  1. はい
  2. それだけです。

Observer/Publisher-Subscriber パターン (または Mediator パターン) を扱うときのポイントは、「発行」を行っているクラスのタイプが実際には問題ではないということです。

Aそれがエミッターであると仮定します:

var B = { doStuff : function () { console.log("Yo!"); } };

A.addListener("someEvent", B.doStuff);
A.emit("someEvent");

実際にやり取りさせたい場合は、手動で相互にサブスクライブする必要があります...

AANDが両方ともBエミッターであると仮定すると、次のようになります。

B.doStuff = function () { this.emit("B's event", "Yo!"); };
A.doThing = function (param) { console.log(param); };

B.addListener("B's event", A.doThing);
A.addListener("A's event", B.doStuff.bind(B));

A.emit("A's event");

または、Mediator パターンを調べる必要があります (これも「放出」​​しますが、お互いを知らないが、同じイベント名を使用し、明確に定義されたデータを渡す多くのオブジェクト間を仲介する 1 つのオブジェクトであることを意図しています)。良い API のように)。

MediatorがエミッターでありA、 、Bおよびでないと仮定すると、次のようになりCます。

var A = {
        getData : function (request) { /* network call */ this.dataCallback(data); },
        dataCallback : function (data) { Mediator.emit("data-recieved", data); }
    },
    B = {
        display  : document.getElementById("data-display"),
        showData : function (data) { /* make DOM representation */ }
    },
    C = {
        input : document.getElementById("request-input"),
        button : document.getElementById("request-button"),
        getRequest : function () {
            var request = this.input.value;
            this.requestData(request);
            this.disableButton();
        },
        requestData : function (request) { Mediator.emit("data-request", request); },
        disableButton : function () { this.button.disabled = true; },
        enableButton  : function () { this.button.disabled = false; }
    };


    Mediator.addListener("data-request", A.getData.bind(A));
    Mediator.addListener("data-received", B.showData.bind(B));
    Mediator.addListener("data-received", C.enableButton.bind(C));

    C.button.addEventListener("click", C.getRequest.bind(C), false);

これで、お互いについて何も知らない 3 つのクラスができました。それぞれに独自の特別な目的があり、「お互い」に期待されるのは、イベント名とデータ型が適切であることだけです。

彼らは皆、について知っていMediatorます。
Mediator をさらに抽象化する場合は、クラスを作成するときに参照を渡すことができます。

function A (param1, param2) {
    var emitter = null;
    this.setEmitter = function (myEmitter) { emitter = myEmitter; };
    this.emit = function (evt, data) {
        if (!emitter) { return; }
        emitter.emit(evt, data);
    };
    this.subscribe = function (evt, callback) {
        if (!emitter) { return; }
        emitter.addListener(evt, callback);
    };
    /* rest of the object */
};


var a = new A();
var b = new A();


a.setEmitter(Mediator);
a.subscribe("some-evt", a.doSomething.bind(a));

b.setEmitter(Mediator);
b.subscribe("other-evt", b.doSomethingElse.bind(b));

a.emit("other-evt", { /* data */ });

aここでは、同じクラスである必要はまったくありbません。
そして今、彼らはあなたが想像している方法で機能します.
どちらも依存性注入 (「制御の反転」) を使用して同じエミッター ( Moderator) を指しているため、同じイベント リストを知らずに操作しており、独自のメソッドを使用してModerators イベントをサブスクライブしています。 .

于 2012-11-06T15:02:20.717 に答える