Heim  >  Artikel  >  Web-Frontend  >  Ein einfaches Beispiel für ein Publish/Subscribe-Muster in JavaScript_Javascript-Tipps

Ein einfaches Beispiel für ein Publish/Subscribe-Muster in JavaScript_Javascript-Tipps

WBOY
WBOYOriginal
2016-05-16 16:32:081198Durchsuche

Als ich das letzte Mal den Beobachtermodus studiert habe, hieß es in vielen Artikeln, dass er auch „Subscribe/Publish“ (Veröffentlichungs-/Abonnementmodus) genannt wird. Im Buch „Javascript Design Patterns“ gibt es jedoch immer noch einige Unterschiede zwischen diesen beiden Mustern. Die Originalwörter im Buch lauten wie folgt:

1. Der Beobachtermodus erfordert, dass Beobachter, die Themenbenachrichtigungen erhalten möchten, Inhaltsänderungsereignisse abonnieren müssen.

2. Der Abonnement-/Veröffentlichungsmodus verwendet einen Themen-/Ereigniskanal, der zwischen Abonnenten und Herausgebern besteht. Das Ereignissystem ermöglicht es Code, anwendungsspezifische Ereignisse zu definieren, denen benutzerdefinierte Parameter übergeben werden können, die von Abonnenten benötigte Werte enthalten. Sein Zweck besteht darin, Abhängigkeiten zwischen Abonnenten und Herausgebern zu vermeiden.

Der Unterschied zum Observer-Muster besteht darin, dass jeder Abonnent die entsprechenden Ereignishandler ausführen kann, um sich zu registrieren und Benachrichtigungen vom Herausgeber zu erhalten.

Okay, ich weiß es nicht. Das Folgende ist mein Verständnis:

1. Im Beobachtermuster ist das Zielobjekt für die Aufrechterhaltung des Beobachters verantwortlich. Beim Publish/Subscribe-Modell kümmert sich der Herausgeber nicht um die Abonnenten und ist nur für das Verwerfen der Nachrichten verantwortlich.

2. Im Beobachtermuster muss der Beobachter eine Schnittstelle bereitstellen und diese Schnittstelle dann aufrufen, wenn sich das Zielobjekt ändert, um seinen eigenen Zustand mit dem Zielzustand konsistent zu halten. Das heißt, alle Beobachter müssen über eine einheitliche Schnittstelle verfügen (z. B. die oben beschriebene Aktualisierungsmethode, jede Methode muss diesen Namen tragen). Im Publish/Subscribe-Modell ist das Auslösen von Abonnentenereignissen nicht auf eine solche Schnittstelle angewiesen, sondern wird vom Abonnenten durch Abhören einer bestimmten Nachricht ausgelöst (diese Nachricht enthält im Allgemeinen den Namen und die vom Abonnenten benötigten Parameter). Es versteht sich, dass der Abonnent nicht den Herausgeber, sondern den Nachrichtenpool überwacht. Solange sich im Nachrichtenpool eine Nachricht befindet, die ihn interessiert, wird ein Ereignis ausgelöst, unabhängig davon, wer die Nachricht veröffentlicht hat. Herausgeber und Abonnenten sind entkoppelt.

Das Folgende ist die Implementierung des Publish/Subscribe-Modus in js. Kopieren Sie es, fügen Sie es in die Konsole ein und probieren Sie es aus:

Code kopieren Der Code lautet wie folgt:

var pubsub = (function(){
var q = {}
Themen = {},
         subUid = -1;
//Neuigkeiten veröffentlichen
​ q.publish = function(topic, args) {
If(!topics[topic]) {return;}
      var subs = topic[topic],
            len = subs.length;
​​​​while(len--) {
              subs[len].func(topic, args);
}
         gib dies zurück;
};
//Veranstaltungen abonnieren
​ q.subscribe = function(topic, func) {
themen[thema] = themen[thema] ? themen[thema] : [];
      var token = ( subUid).toString();
themen[thema].push({
Token: Token,
              func : func
});
         Token zurückgeben;
};
Geben Sie q;
zurück //Kein Schreiben mehr, wenn Sie das Abonnement kündigen, die Themen durchlaufen, dann das Token durch Speichern zurückgeben und das angegebene Element
löschen })();
//Ausgelöstes Ereignis
var logmsg = function(topics, data) {
console.log("logging:" topic ":" data);
}
//Hören Sie sich die angegebene Nachricht „msgName“
an var sub = pubsub.subscribe('msgName', logmsg);
//Nachricht „msgName“ veröffentlichen
pubsub.publish('msgName', 'hello world');
//Eine nicht überwachte Nachricht „msgName1“ veröffentlichen
pubsub.publish('anotherMsgName', 'me too!');
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn