js简单粗暴的发布订阅

   日期:2021-01-22     浏览:95    评论:0    
核心提示:应用场景欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增

使用场景

异步通信、多页面间相互通信,pageA 的方法想在 pageB的方法调用的某个时机触发

直接上代码

class Publish {
    constructor() {
        this.listMap = {};
    }
	// 订阅
    on(key, fn) {
        this.listMap[key]
            ? this.listMap[key].push(fn)
            : this.listMap[key] = [fn];
            
		// 存储订阅fn的下标
        const index = this.listMap[key].length - 1;
        
		// 返回取消订阅的function
        return () => this.clear(key, index);
    }
    
	// 取消所有该key订阅
    off(key) {
        delete this.listMap[key];
    }
    
	// 取消key的指定的某个订阅
    clear(key, index) {
        index === this.listMap[key].length - 1
            ? this.listMap[key].pop()
            : this.listMap[key][index] = null;
    }
    
	//订阅一次触发后自动取消订阅
    once(key, fn) {
        this.on(key, (...rest) => {
            fn(...rest);
            this.off(key);
        });
    }

	// 发布key
    trigger(key, ...rest) {
    	if(key in this.listMap) {
	    	this.listMap[key].forEach(fn => {
	            fn(...rest);
	        });
    	}
    }
}

使用方法

const ob = new Publish();

// 订阅 sub1
const sub1 = ob.on('sub1', (a, b) => { 
    console.log('sub1', a, b);
});

// 订阅 sub1
const sub11 = ob.on('sub1', (a, b) => { 
    console.log('sub11', a, b);
});

ob.trigger('sub1', 2, 3);

// 取消订阅sub1
sub1();

// 取消订阅sub11
sub11();

// 订阅 sub3
ob.on('sub3', (a, b) => { 
    console.log('sub3', a, b);
});

// 订阅 sub3
ob.on('sub3', (a, b) => { 
    console.log('sub33', a, b);
});

ob.trigger('sub3', 6, 7);

// 取消订阅所有的sub3
ob.off('sub3');

// 订阅一次就自行取消订阅
ob.once('sub4', (a, b) => { 
    console.log('sub4', a, b);
});

ob.trigger('sub4', 8, 9);
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服