这篇文章主要介绍javascript发布订阅模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
发布订阅模式
事件发布/订阅模式 (PubSub) 在异步编程中帮助我们完成更松的解耦,甚至在 MVC、MVVC 的架构中以及设计模式中也少不了发布-订阅模式的参与。
优点:在异步编程中实现更深的解耦
缺点:如果过多的使用发布订阅模式,会增加维护的难度
实现发布订阅模式
var Event = function() { this.obj = {} } Event.prototype.on = function(eventType,fn) { if(!this.obj[eventType]) { this.obj[eventType] = [] } this.obj[eventType].push(fn) } Event.prototype.emit = function() { // 取第一个参数,作为eventType var eventType = Array.prototype.shift.call(arguments); // 获取事件数组 var arr = this.obj[eventType]; var len = arr.length; // 循环数组,一次执行其中的函数 for(var i=0;i<len;i++) { // 直接调用arr[i],其this指向为undefined(严格模式下) // 因此用apply将this指向arr[i] // 数组shift函数取出第一个参数,将剩下的参数传入函数中 arr[i].apply(arr[i],arguments) } } var ev = new Event() ev.on('click',function(a) { // 订阅 console.log(a) }) ev.emit('click',1) // 发布
以上代码只能实现先订阅,再发布。直接发布就会报错。如何实现可以先发布,然后订阅?
var Event = function() { this.obj = {}; this.cacheList = []; } Event.prototype.emit = function() { const args = arguments; //函数参数 const that = this; //this指向,保持cache函数的this指向 function cache() { var eventType = Array.prototype.shift.call(arg) var arr = that.obj[eventType] for (let i = 0; i < arr.length; i++) { arr[i].apply(arr[i], arg) } } this.cacheList.push(cache) // 采用闭包,保持对emit函数中参数和that的引用 } Event.prototype.on = function(eventType,fn) { if(!this.obj[eventType]) { this.obj[eventType] = [] } this.obj[eventType].push(fn) // 在订阅函数中执行emit函数中缓存的函数 for (let i = 0; i < this.cacheList.length; i++) { this.cacheList[i]() } }
改成这样后就实现了先发布函数,再订阅的过程。但是也只能先发布,然后再订阅,反过来就行不通。
以上是“javascript发布订阅模式的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。