发布订阅的思想在很多场景里会用到,也是用的最多,大家喜欢用的思想。举以下几个例子:
- Dom的事件线程订阅了很多事件,当有用户触发,就会调用对应的事件callback,callback就会被加入到js的事件循环里。btn.onClick = function(){}, function就相当于发布者,onclick就是订阅者。
- Promise的then和resolve,then就相当于订阅者,resove就是发布者。
- 还有redux里面的state,dispatch,页面mapStateToRedux就是订阅,dispatch就是发布。
- ......
咱们使用发布订阅模式来模拟一下简单的发布订阅模型。
const SubPubCenter = {
clients: [],
subscribe: function (key, fn) {
this.clients.push({ key, fn })
},
publish: function (msg) {
this.clients.forEach(item => {
const { key, fn } = item;
fn.call(this, key, msg)
}
)
}
}
SubPubCenter.subscribe('张三', function (key, msg) {
console.log(`${key} receive ${msg}`)
})
SubPubCenter.subscribe('李四', function (key, msg) {
console.log(`${key} receive ${msg}`)
})
SubPubCenter.publish("你好");
// 张三 receive 你好
// 李四 receive 你好