EventEmitter的前端JS实现
EventEmitter的前端JS实现/**
* on(event, listener):为指定事件注册⼀个,接受⼀个字符串 event 和⼀个回调函数。
* emit(event, [arg1], [arg2]):按的顺序执⾏执⾏每个
* addListener(event, listener):on的同名函数(alias)
* once(event, listener): 和on类似,但只触发⼀次,随后便解除事件监听
* removeListener(event, listener):移除指定事件的某个监听回调
* removeAllListeners([event]):移除指定事件的所有监听回调
* setMaxListeners(n):⽤于提⾼的默认限制的数量。(默认10监听回调个产⽣警告)
* listeners(event):返回指定事件的数组。
*/
var EventEmitter = {
maxListeners: 10,
events: {},
on: function(event, listener) {
if (!this.events[event]) {
this.events[event] = [listener]
return
}
this.events[event].push(listener)
if (this.events[event].length > this.maxListeners) {
console.warn(event + '超出' + this.maxListeners + '监听')
}
},
emit: function(event) {
var params = [].slice.call(arguments)
params.shift()
if (!this.events[event]) {
return
}
var originLen = this.listeners(event).length
for (var i = 0 ; i < this.events[event].length; i++) {
this.events[event][i].apply(null, params)
if (originLen > this.events[event].length) {
// 解决 once执⾏removeListener函数的时候长度问题导致的event漏执⾏问题
i--
originLen--
}
}
},
addListener: function(event, listener) {
(event, listener)
},
once: function(event, listener) {
var self = this
function fn() {
var args = [].slice.call(arguments)
listener.apply(null, args)
}
<(event, fn)
},
removeListener: function(event, listener) {
if (!this.events[event]) {
return
}
var index = this.events[event].indexOf(listener)
if (index >= 0) {
this.events[event].splice(index, 1)
}
},
removeAllListeners: function(event) {
if (event) {
delete this.events[event]
} else {
this.events = {}
}
},
setMaxListeners: function(n) {
this.maxListeners = n
},
listeners: function(event) {
if (this.events[event]) {
return this.events[event]
} else {
return []
}
}
}
<('event', function() {
console.log('仅仅触发⼀次')
console.log('仅仅触发⼀次')
})
<('event', function(arg1) {
console.log('⼀个参数', arg1)
})
<('event', function(arg1, arg2) {
console.log('⼆个参数', arg1, arg2)
})
<('event', function(arg1, arg2, arg3) { console.log('三个参数', arg1, arg2, arg3)
})
// 打印:
// 仅仅触发⼀次
// ⼀个参数 1
// ⼆个参数 1 2
// 三个参数 1 2 3
// ⼀个参数 1
// ⼆个参数 1 2
/
/ 三个参数 1 2 3
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论