PubSub.js:
// 用于消息的发布订阅 使用subscribe方法订阅,接受两个参数,第一个是关键字,第二个是callback,返回值为一个token,用于解除订阅
// 使用publish方法发布,可接受任意参数
// 当订阅的内容发生改变时,触发回调
// eventList:{
// [name]:[
// {token:token1, cb:callback1},
// {token:token2, cb:callback2},
// ...
// ]
// }
function randomCode() {
return Math.random().toString(32).substring(2);
}
class PubSub {
constructor() {
this.eventList = {};
}
subscribe(name, cb) {
const eventList = this.eventList;
const token = randomCode();
if (!(name in eventList)) {
eventList[name] = [];
}
if (typeof cb !== 'function') return;
eventList[name].push({
token,
cb
});
return token;
}
}
const pubsub = new PubSub();
export default pubsub;
import PubSub from './PubSub.js'
const token1 = PubSub.subscribe('name', data => {
console.log('1', data);
});
const token2 = PubSub.subscribe('name', data => {
console.log('2', data);
});
PubSub.publish('name', { title: '这是我订阅的消息' });
// 控制台输出
// '1', { title: '这是我订阅的消息' }
// '2', { title: '这是我订阅的消息' }
// --------------------------------------------------------------------------------
// 取消订阅其中一个然后再次发布
PubSub.unsubscribe(token1);
PubSub.publish('name', { title: '这是我订阅的消息2' });
// 控制台输出
// '2', { title: '这是我订阅的消息2' }