PubSubJS is a topic-based publish/subscribe library written in JavaScript.
PubSubJS has synchronisation decoupling, so topics are published asynchronously. This helps keep your program predictable as the originator of topics will not be blocked while consumers process them.
For the adventurous, PubSubJS also supports synchronous topic publication. This can give a speedup in some environments (browsers, not all), but can also lead to some very difficult to reason about programs, where one topic triggers publication of another topic in the same execution chain.
PubSubJS is designed to be used within a single process, and is not a good candidate for multi-process applications (like Node.js – Cluster with many sub-processes). If your Node.js app is a single process app, you're good. If it is (or is going to be) a multi-process app, you're probably better off using redis Pub/Sub or similar
There are several ways of getting PubSubJS
npm install pubsub-js
)Note: the last version of this library available via bower is v1.5.4
First you have to import the module:
import PubSub from 'pubsub-js' // or when using CommonJS const PubSub = require('pubsub-js');
// create a function to subscribe to topics var mySubscriber = function (msg, data) { console.log( msg, data ); }; // add the function to the list of subscribers for a particular topic // we're keeping the returned token, in order to be able to unsubscribe // from the topic later on var token = PubSub.subscribe('MY TOPIC', mySubscriber); // publish a topic asynchronously PubSub.publish('MY TOPIC', 'hello world!'); // publish a topic synchronously, which is faster in some environments, // but will get confusing when one topic triggers new topics in the // same execution chain // USE WITH CAUTION, HERE BE DRAGONS!!! PubSub.publishSync('MY TOPIC', 'hello world!');Cancel specific subscription
// create a function to receive the topic var mySubscriber = function (msg, data) { console.log(msg, data); }; // add the function to the list of subscribers to a particular topic // we're keeping the returned token, in order to be able to unsubscribe // from the topic later on var token = PubSub.subscribe('MY TOPIC', mySubscriber); // unsubscribe this subscriber from this topic PubSub.unsubscribe(token);Cancel all subscriptions for a function
// create a function to receive the topic var mySubscriber = function(msg, data) { console.log(msg, data); }; // unsubscribe mySubscriber from ALL topics PubSub.unsubscribe(mySubscriber);Clear all subscriptions for a topic
PubSub.subscribe('a', myFunc1); PubSub.subscribe('a.b', myFunc2); PubSub.subscribe('a.b.c', myFunc3); PubSub.unsubscribe('a.b'); // no further notifications for 'a.b' and 'a.b.c' topics // notifications for 'a' will still get published
PubSub.clearAllSubscriptions(); // all subscriptions are removed
PubSub.getSubscriptions('token'); // subscriptions by token from all topics
PubSub.countSubscriptions('token'); // count by token from all topics
// isPublished is a boolean that represents if any subscribers was registered for this topic var isPublished = PubSub.publish('a'); // token will be false if something went wrong and subscriber was not registered var token = PubSub.subscribe('MY TOPIC', mySubscriber);
// create a subscriber to receive all topics from a hierarchy of topics var myToplevelSubscriber = function (msg, data) { console.log('top level: ', msg, data); } // subscribe to all topics in the 'car' hierarchy PubSub.subscribe('car', myToplevelSubscriber); // create a subscriber to receive only leaf topic from hierarchy op topics var mySpecificSubscriber = function (msg, data) { console.log('specific: ', msg, data); } // subscribe only to 'car.drive' topics PubSub.subscribe('car.drive', mySpecificSubscriber); // Publish some topics PubSub.publish('car.purchase', {name: 'my new car'}); PubSub.publish('car.drive', {speed: '14'}); PubSub.publish('car.sell', {newOwner: 'someone else'}); // In this scenario, myToplevelSubscriber will be called for all // topics, three times in total // But, mySpecificSubscriber will only be called once, as it only // subscribes to the 'car.drive' topic
Use "constants" for topics and not string literals. PubSubJS uses strings as topics, and will happily try to deliver your topics with ANY topic. So, save yourself from frustrating debugging by letting the JavaScript engine complain when you make typos.
Example of use of "constants"// 👎 Bad usage PubSub.subscribe('hello', function (msg, data) { console.log(data) }); PubSub.publish('hello', 'world'); // 👍 Better usage var MY_TOPIC = 'hello'; PubSub.subscribe(MY_TOPIC, function (msg, data) { console.log(data) }); PubSub.publish(MY_TOPIC, 'world');Example of use of "symbol constants" with ES6/7 syntax
// event-types.js export const MY_TOPIC = Symbol('MY_TOPIC') // somefile.js import { MY_TOPIC } from './event-types.js' PubSub.subscribe(MY_TOPIC, function (msg, data) { console.log(data) }); PubSub.publish(MY_TOPIC, 'world');Immediate Exceptions for stack traces in developer tools
As of version 1.3.2, you can force immediate exceptions (instead of delayed exceptions), which has the benefit of maintaining the stack trace when viewed in dev tools.
This should be considered a development only option, as PubSubJS was designed to try to deliver your topics to all subscribers, even when some fail.
Setting immediate exceptions in development is easy, just tell PubSubJS about it after it has been loaded.
PubSub.immediateExceptions = true;
Please see CONTRIBUTING.md
More about Publish/SubscribePubSubJS uses Semantic Versioning for predictable versioning.
Please see https://github.com/mroderick/PubSubJS/releases
MIT: http://mrgnrdrck.mit-license.org
These are a few alternative projects that also implement topic based publish subscribe in JavaScript.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4