用es6方式的写的订阅发布的模式


//发布订阅模式
class EventEmiter {
constructor() {
//维护一个对象
this. _events = {

}
}
on( eventName, callback) {
if ( this. _events[ eventName]) {
//如果有就放一个新的
this. _events[ eventName]. push( callback);
} else {
//如果没有就创建一个数组
this. _events[ eventName] = [ callback]
}
}
emit( eventName, ... rest) {
console. log(... rest + 'rest的写法')
// alert(...rest)
if ( this. _events[ eventName]) { //循环一次执行
this. _events[ eventName]. forEach(( item) => {
item. apply( this, rest)
});
}
}
removeListener( eventName, callback) {
alert( callback)
if ( this. _events[ eventName]) {
//当前数组和传递过来的callback相等则移除掉
this. _events[ eventName] =
this. _events[ eventName]. filter( item => item !== callback);
}
}
once( eventName, callback) {
function one() {
//在one函数运行原来的函数,只有将one清空
callback. apply( this, arguments);
//先绑定 执行后再删除
this. removeListener( eventName, one);
}
this. on( eventName, one);
//此时emit触发会执行此函数,会给这个函数传递rest参数
}
}
class Man extends EventEmiter { }
let man = new Man()
function findGirl() {
console. log( '找新的女朋友')
}
function saveMoney() {
console. log( '省钱')
console. log( 'arguments' + JSON. stringify( arguments));
}
// man.once('失恋', findGirl);
// man.on('失恋', findGirl) //失恋 ,绑定一个函数方法
man. on( '失恋', saveMoney) //失恋 ,绑定一个函数方法
// man.removeListener('失恋', saveMoney); //移除一个函数方法
man. emit( '失恋', [ 'wewe', 'jjj']);
// man.emit('失恋');
// man.emit('失恋');
//绑定一次,触发多次,也只执行一次。触发后一次将数组中的哪一项删除掉下次触发就不会执行


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM