异步编程演变和发布订阅¶
浏览器的多线程¶
其中的JavaScript引擎线程就是我们前面说的主线程,主要作用就是解析和执行JavaScript代码
异步处理线程,JavaScript最原始的方式就是通过回调函数来执行异步任务,当某线程执行结束后将其回调函数塞入消息队列中等待继续执行
异步编程的解决方案¶
- 发布/订阅
- deferred对象
- Promise
- Generator
- async/await
后三者是JavaScript的异步任务的处理规范,最终目的是使用同步的写法实现异步代码
发布订阅¶
有后端基础的同学应该不难想到后端的消息队列,RocketMQ等
发布订阅简单实现:
let eventMap={} //消息平台
function pub(msg,...rest){
eventMap[msg] && eventMap[msg].forEach(cb=>{ // eventMap[msg]找到对应的主题下的所有订阅者
cb(...rest) // 执行所有订阅者的回调函数
})
}
function sub(msg,cb) { //消费者的构造函数,创建消费者对象的时候入参:消息主题和回调函数
eventMap[msg] = eventMap[msg] || []
eventMap[msg].push(cb)// 将对应的回调函数push进订阅者中
}
如何实现异步编程
- A执行结束后,发布消息mesA
- B订阅消息mesA,并执行对应的回调函数function。在回调函数中发布消息mesB
- C订阅消息mesB,并执行的对应的回调函数...
发布订阅模式:发布者和订阅者之间是完全解耦的,
观察者模式:这个设计是松耦合的,被观察者需要维护一个观察者的集合,将有关状态的任何变更自动通知给观察者
VUE中的数据侦测观察者¶
可以详细了解