簡單實現一個EventEmiter
阿新 • • 發佈:2019-01-08
在前端開發中,“釋出-訂閱”也是“觀察者模式”是一種常用的設計模式;之前對設計模式沒有過深的認識,直到前段時間在封裝一個運用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')