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

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

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


实现流程app

  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);
复制代码
相关文章
相关标签/搜索