JavaScript_javascript ヒントのパブリッシュ/サブスクライブ パターンの簡単な例

WBOY
リリース: 2016-05-16 16:32:08
オリジナル
1234 人が閲覧しました

前回、オブザーバー モードについて勉強しましたが、多くの記事で、これは Subscribe/Publish (パブリッシュ/サブスクライブ モード) とも呼ばれると書かれていました。しかし、『JavaScript Design Patterns』という本では、これら 2 つのパターンの間にはまだいくつかの違いがあると記載されています。この本の元の言葉は次のとおりです:

1. オブザーバー モードでは、トピック通知を受け取りたいオブザーバーはコンテンツ変更イベントをサブスクライブする必要があります。

2.サブスクライブ/パブリッシュ モードは、サブスクライバーとパブリッシャー間のトピック/イベント チャネルを使用します。イベント システムを使用すると、サブスクライバが必要とする値を含むカスタム パラメータを渡すことができるアプリケーション固有のイベントをコードで定義できます。その目的は、サブスクライバーとパブリッシャー間の依存関係を回避することです。

オブザーバー パターンとは異なり、サブスクライバーが適切なイベント ハンドラーを実行して登録し、パブリッシャーからの通知を受信できるようになります。

わかりました、わかりません。私の理解は次のとおりです:

1. オブザーバー パターンでは、ターゲット オブジェクトがオブザーバーを維持します。パブリッシュ/サブスクライブ モデルでは、パブリッシャーはサブスクライバーについては考慮せず、メッセージをスローすることのみを担当します。

2. オブザーバー パターンでは、オブザーバーはインターフェイスを提供し、ターゲット オブジェクトが変更されたときにそのインターフェイスを呼び出して、自身の状態とターゲットの状態の一貫性を保つ必要があります。つまり、すべてのオブザーバーが統一されたインターフェイスを持っている必要があります (上で書いた update メソッドのように、全員のメソッドがこの名前である必要があります)。パブリッシュ/サブスクライブ モデルでは、サブスクライバー イベントのトリガーはそのようなインターフェイスには依存しませんが、特定のメッセージ (通常、このメッセージにはサブスクライバーが必要とする名前とパラメーターが含まれます) をリッスンすることによってサブスクライバーによってトリガーされます。サブスクライバーが監視しているのはパブリッシャーではなく、メッセージ プールであることがわかります。メッセージ プールに対象のメッセージがある限り、メッセージをパブリッシュした人に関係なく、イベントがトリガーされます。パブリッシャーとサブスクライバーは切り離されています。

以下は、js でのパブリッシュ/サブスクライブ モードの実装です。これをコピーしてコンソールに貼り付け、試してみてください。

コードをコピーします コードは次のとおりです:
var pubsub = (function(){
var q = {}
トピック = {}、
subUid = -1;
//ニュースを公開
q.publish = function(topic, args) {
If(!topics[トピック]) {return;}
var subs = トピック[トピック],
len = subs.length;
while(len--) {
subs[len].func(topic, args);
}
これを返します;
};
//イベントを購読する
q.subscribe = function(topic, func) {
トピック[トピック] = トピック[トピック] トピック[トピック] : [];
? var token = ( subUid).toString();
トピック[トピック].push({
トークン: トークン、
func : func
});
トークンを返す;
};
qを返します;
//サブスクリプションをキャンセルし、トピックを横断し、保存してトークンを返し、指定された要素を削除すると、これ以上書く必要はありません
})();
// トリガーされたイベント
var logmsg = function(トピック, データ) {
console.log("ロギング:" トピック ":" データ);
}
//指定されたメッセージ 'msgName'
を聞きます var sub = pubsub.subscribe('msgName', logmsg);
//メッセージ「msgName」をパブリッシュします
pubsub.publish('msgName', 'hello world');
//監視されていないメッセージ「msgName1」をパブリッシュします
pubsub.publish('anotherMsgName', '私もです!');

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート