如何10行代码实现node的events的事件发送和监听
如何10行代码实现node的events的事件发送和监听
突然来了兴致想要自己写写node 的事件监听和发送,使用了比较简单的方法实现了一下,代码如下
如何10行代码实现node的events的事件发送和监听
const events = {
data: [],
on: (event, cb) => {
events.data.push({ event, cb })
},
emit: (event, data) => {
events.data.forEach(e => {
if (e.event === event) {
e.cb(data)
}
})
}
}
//以下为测试代码
events.on('event', (data) => {
console.log('data', data)
})
events.on('event', (data) => {
console.log('data1', data)
})
events.emit('event', 'data')
10 回复
哈哈哈
一般会再问你
- 这个时间复杂度是什么样的
- 还有啥优化空间
- 如何传参
- 如何控制this
666
@netwjx 这个时间复杂度是什么样的 异步其实不太需要关心复杂度,可以忍受等待 还有啥优化空间 哈哈,挺好的了 如何传参 data给用户自己传,不限定类型 如何控制this 这里都没有this
@netwjx 当然,目前是O(n), 如果使用Map那就是O(1)
异步其实不太需要关心复杂度
需要关心时间复杂度,因为 emit 处理时间过长会让其他底层 libuv 等待处理的事件处在排队中
function Event() {
const x = {}
return {
on(name, handler) {
x[name] = x[name] || []
x[name].push(handler)
},
emit(name, event) {
for(let h of x[name])
try{
h(event)
} catch(e) {
// ...
}
}
}
}
@daGaiGuanYu 这个靠谱, 还规避了使用this
以前还想过用这种形式写"class", 能减少很多 “this.” 代码
mitt,基本上是一模一样
摸了一下events源码,本质上是data是一个{ [key: string]: Array<Function>}类型用来存储事件列表,达到先on的事件先触发