用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