发布-订阅方式实现异步并发

通过发布/订阅者模式实现异步并发

异步意味着我们期望得到的结果不会像同步那样顺序或串行拿到结果,什么时候得到结果是未知的 发布订-阅者模式实现异步并发非常简单,它的关键在于: 每次程序调用都会去执行(即发布)已经被订阅过的所有方法,在订阅的方法中去判断是否满足条件,满足条件则执行接下来的其它操作..


实现流程

  1. 定义对象, 该对象具有订阅方法、发布方法、用于存放订阅方法的集合
let obj = {
	// 用于存放所有订阅的方法,在每次发布的时候会挨个的执行一次
	funcArray: [],
	// 用于订阅,执行它会把要订阅的方法存放到方法集合中
	on (func){
		this.funcArray.push(func);
	},
	// 发布,该方法会把订阅的方法挨个的执行一次,执行的过程中不断地去判断是否满足某个条件
	fire (){
		this.funcArray.forEach( func => func.apply(this, arguments));
	}
}; 

复制代码
  1. 定义用于监测的对象
// 假定异步全部执行完成后期望得到的结果是: myInfo = {age: 18, sex: 'man'}; ,根据该条件定义对象
let myInfo = {};

// 判断是否满足的条件是: myInfo对象 既有age属性,又有sex属性;
let keys = Object.keys(myInfo);
if(keys.includes('age') && keys.includes('sex')){ // something.....}

复制代码
  1. 订阅方法
obj.on((key, data) => {
	myInfo[key] = data;
	let keys = Object.keys(myInfo);
	if(keys.includes('age') && keys.includes('sex')){
		console.log(myInfo);
	}
});
复制代码
  1. 异步执行,执行的回调里面进行发布
setTimeout(()=>{
	obj.fire('age', 18);
}, 2000);

setTimeout(()=>{
	obj.fire('sex', 'man');
}, 3000);
复制代码
  1. 简单化
	// 订阅的过程,实质上就是把要执行的方法存起来
	let fn1 = function(){ console.log('fn1'); }
	let fn2 = function(){ console.log('fn2'); }
	let arr = [fn1, fn2];
复制代码
	// 发布实质上就是把订阅的方法挨个的执行
	arr.forEach(fn=>fn());  // 发布
复制代码
  1. 完整代码 可拷贝直接运行
	let obj = {
		// 用于存放所有订阅的方法,在每次发布的时候会挨个的执行一次
		funcArray: [],
		// 用于订阅,执行它会把要订阅的方法存放到方法集合中
		on (func){
			this.funcArray.push(func);
		},
		// 发布,该方法会把订阅的方法挨个的执行一次,执行的过程中不断地去判断是否满足某个条件
		fire (){
			this.funcArray.forEach( func => func.apply(this, arguments));
		}
	}; 
	
	
	let myInfo = {};
	
	obj.on((key, data) => {
		myInfo[key] = data;
		let keys = Object.keys(myInfo);
		if(keys.includes('age') && keys.includes('sex')){
			console.log('Success! coding...');
		}
	});
	
	setTimeout(()=>{
		obj.fire('age', 18);
	}, 2000);
	
	setTimeout(()=>{
		obj.fire('sex', 'man');
	}, 3000);
复制代码

转载于:https://juejin.im/post/5c93b3be6fb9a070f90ab9f7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
发布-订阅消息传递方式有以下几个特点: 1. 一对多通信:发布-订阅模式允许一个消息发布者将消息发送给多个订阅者。发布者不需要关心有多少个订阅者,只需将消息发布到相应的主题中,所有订阅该主题的订阅者都可以接收到消息。这种一对多的通信特点使得消息可以被广播到多个订阅者,满足多个接收方的需求。 2. 异步通信:在发布-订阅模式中,消息的发送和接收是异步的。发布者将消息发布到主题后,可以继续执行其他任务,而不需要等待订阅者的响应。订阅者则可以在自己合适的时间接收和处理消息。这种异步通信方式能够提高系统的响应性能和并发处理能力。 3. 无状态通信:发布-订阅模式是一种无状态的通信方式发布者和订阅者之间不需要直接交互,也不需要保持彼此的状态信息。发布者只需将消息发布到主题中,而订阅者只需通过订阅感兴趣的主题来接收消息。这种无状态通信使得发布者和订阅者可以独立地进行扩展和演化。 4. 松耦合:发布-订阅模式实现发布者和订阅者之间的松耦合关系。发布者并不直接发送消息给特定的订阅者,而是将消息发送到主题中,订阅者只需要通过订阅感兴趣的主题来接收消息。这种解耦使得发布者和订阅者可以独立地演化和扩展,而不会对彼此产生直接的影响。 5. 解耦分布式系统:在分布式系统中,不同的组件或服务可能位于不同的节点上。发布-订阅模式可以帮助解耦系统中的各个组件,使得它们可以独立地进行扩展和演化。通过使用统一的消息传递机制,发布者和订阅者可以在不同的节点上进行部署,而不需要直接通信。 综上所述,发布-订阅消息传递方式具有一对多通信、异步通信、无状态通信、松耦合和解耦分布式系统等特点,使得它在构建大规模、高性能的系统中被广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值