如何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 回复
@netwjx 这个时间复杂度是什么样的 异步其实不太需要关心复杂度,可以忍受等待 还有啥优化空间 哈哈,挺好的了 如何传参 data给用户自己传,不限定类型 如何控制this 这里都没有this
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) {
// ...
}
}
}
}
image.png 摸了一下events源码,本质上是data是一个{ [key: string]: Array<Function>}类型用来存储事件列表,达到先on的事件先触发