1. 程式人生 > >簡單實現一個EventEmiter

簡單實現一個EventEmiter

  在前端開發中,“釋出-訂閱”也是“觀察者模式”是一種常用的設計模式;之前對設計模式沒有過深的認識,直到前段時間在封裝一個運用AngularJS封裝table元件時,遇到一個難題,那就是AngularJS不同自定義指令之間如何進行通訊。聯想到vue中元件間通訊,恍然間意識到,是否可以通過類似的手段來解決這種問題。問題的本質都是子層作用域事件可以傳遞到其他作用域,都有一個觸發條件,類似於A,B,C,D各自相互分離的個體,現在以A為中心,分別向B,C,D拉一條線,有了這條線,B,C,D就可以像A傳遞資訊。類比到js語言,就是要宣告一個變數,確保到每個模組都能訪問到,以此向其他模組分發資訊。簡單的實現如下所示。

var eventEmiter = {
				listeners: {}
			};
			eventEmiter.on = function (type, callback) {
				this.listeners[type] = this.listeners[type] ? this.listeners[type] : [];
				this.listeners[type].push(callback);
			};
			eventEmiter.emit = function(type, payload) {
				if(this.listeners[type]) {
					for (var i = this.listeners[type].length - 1; i >= 0; i--) {
						this.listeners[type][i](payload);
					}
				}
			}
			eventEmiter.on('test', function() {
				console.log(arguments);
			})
			eventEmiter.emit('test', 'test')