發佈-訂閱方式實現異步併發

經過發佈/訂閱者模式實現異步併發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);
複製代碼
相關文章
相關標籤/搜索