當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript发布订阅者模式
生活随笔
收集整理的這篇文章主要介紹了
JavaScript发布订阅者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假如你要建立一個網站,通常來說會有許多用戶。你作為一名管理者,有時候需要將重要的消息發布給你的用戶。在軟件開發領域,開發此功能往往用到發布訂閱者模式。下面我以簡單的javascript來說明。
除此之外,一個Publisher還需要有能夠接納新的訂閱消息的人的功能,或者刪除某個訂閱者的功能,同時需要能夠將消息發送出去的功能。
// 新增訂閱者功能 Publisher.prototype.addUser=function(obj) {const nameList= this.observers.map(item=>{return item.name;})if(nameList.indexOf(obj.name) < 0) {this.observers.push(obj)}return this; } //刪除訂閱者功能 Publisher.prototype.deleteUser=function(obj){let index = -1this.observers.forEach((item,key)=>{if(item.name === obj.name){index = key}})if(index !== -1) {this.observers.splice(index,1)}return this } // 通知訂閱者功能 Publisher.prototype.noticeUser=function(data){ this.observers.forEach((item)=>{item.update(data)}) } 復制代碼值得注意的是,上述通知訂閱者的功能是通過遍歷this.observers 并調用每一個訂閱者的update方法。所以每一個訂閱者需要對應有update方法。每一個訂閱者的類似結構如下:
[{name:'張三',update:(data)=>{console.log(data)}},{name:'李四',update:(data)=>{console.log(data)}},... ] 復制代碼至此一個最簡單的發布訂閱者模式實現了,這里還有兩點優化建議。
第一,上述構造出來的lisi,xiaoming都會自動有update方法,并且update的行為都是一樣的,如果需要例如xiaoming的update與其他不同,只需要重新定義即可
第二, 發布者需要手動調用pb.noticeUser()去通知state消息,可以做到state變動了自動去調用pb.noticeUser()嗎?可以的,此時 Object.defineProperty()就派上用場了
let pb = new Publisher() Object.defineProperty(pb,'state',{set:function(newVal,) {let a = thisdebuggerpb.noticeUser(newVal) } }) pb.addUser(lisi) pb.addUser(xiaoming) pb.state = '123' //pb.noticeUser() 復制代碼如果state變化了將自動觸發pb.noticeUser(),實現自動通知功能,是不是有點Vue原理既視感!
總結
以上是生活随笔為你收集整理的JavaScript发布订阅者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DAMS2019中国数据智能管理峰会将于
- 下一篇: JavaScript中HTML的DOM