Pubsub-JS
PubSubJS 是一个用 JavaScript 编写的基于主题的发布/订阅库。
PubSubJS 具有同步解耦功能,因此主题是异步发布的。这有助于保持程序的可预测性,因为在使用者处理主题时,主题的发起者不会被阻止。
主要特点
- 无依赖
- 同步去耦
- 小(ish),小于1kb缩小和压缩
- 易于理解和使用(得益于同步解耦)
- 不修改订阅者(jQuery 自定义事件修改订阅者)
- 兼容 ES3。PubSubJS 应该能够在任何可以执行 JavaScript 的地方运行。
安装
使用 npm 安装:
shell
pnpm i pubsub-js
在使用时导入模块:
js
import PubSub from 'pubsub-js'
基本示例
在 App.vue 中,使用 PubSub.publish()
发布事件:
js
import { onMounted } from "vue";
import PubSub from "pubsub-js";
onMounted(() => {
PubSub.publish("my topic", "hello world");
});
在 HelloWorld.vue 中,使用 PubSub.subscribe()
进行订阅:
js
import PubSub from "pubsub-js";
PubSub.subscribe("my topic", function (msg, data) {
console.log(msg); // my topic
console.log(data); // hello world
});
取消特定订阅
可以为 PubSub.subscribe()
函数指定一个 名称,用于 取消订阅:
js
import PubSub from "pubsub-js";
const token = PubSub.subscribe("my topic", function (msg, data) {});
// 取消订阅
PubSub.unsubscribe(token);
也可以直接使用 发布事件 的名称,取消订阅:
js
import PubSub from "pubsub-js";
PubSub.subscribe("my topic", function (msg, data) {});
// 取消订阅
PubSub.unsubscribe("my topic");
清楚所有订阅
js
// 清楚所有订阅
PubSub.clearAllSubscriptions()
获取订阅
js
// 获取订阅
PubSub.getSubscriptions('my topic');
计算订阅数
js
// 计算订阅数
PubSub.countSubscriptions('token');
是否被订阅
在 发布事件时,可以为事件取一个 名称,它的返回值是一个 boolean
类型,如果该事件有订阅,则是 true
,否则为 false
。
js
// 该事件已被订阅
const isPublished = PubSub.publish("my topic", "hello world");
console.log(isPublished); // true
常量技巧
建议:对主题使用 “常量”,而不是字符串文字。
这样的好处是,你可以设定全局对同一个字符串只能发布一次,从而不会导致事件名称被重复发布。
示例:
js
// 👎 Bad usage
PubSub.publish('hello', 'world');
PubSub.subscribe('hello', function (msg, data) {
console.log(data)
});
js
// 👍 Better usage
const MY_TOPIC = Symbol('MY_TOPIC')
PubSub.publish(MY_TOPIC, 'world');
PubSub.subscribe(MY_TOPIC, function (msg, data) {
console.log(data)
});