CNode

如何10行代码实现node的events的事件发送和监听

分享
TTimLiu1发布于5 年前最后回复5 年前10 回复5356 浏览0 收藏

如何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)

I
i5ting#1·5 年前

哈哈哈

N
netwjx#2·5 年前

一般会再问你

  • 这个时间复杂度是什么样的
  • 还有啥优化空间
  • 如何传参
  • 如何控制this
L
leizongmin#3·5 年前

666

T
TimLiu1#4·5 年前
引用 netwjx一般会再问你 这个时间复杂度是什么样的 还有啥优化空间 如何传参 如何控制this

@netwjx 这个时间复杂度是什么样的 异步其实不太需要关心复杂度,可以忍受等待 还有啥优化空间 哈哈,挺好的了 如何传参 data给用户自己传,不限定类型 如何控制this 这里都没有this

H
hsiaosiyuan0#6·5 年前

异步其实不太需要关心复杂度

需要关心时间复杂度,因为 emit 处理时间过长会让其他底层 libuv 等待处理的事件处在排队中

D
daGaiGuanYu#7·5 年前
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) {
		  // ...
		}
	}
  }
}
N
netwjx#8·5 年前
引用 daGaiGuanYu

@daGaiGuanYu 这个靠谱, 还规避了使用this

以前还想过用这种形式写"class", 能减少很多 "this." 代码

H
HobaiRiku#9·5 年前

mitt,基本上是一模一样

I
InCodingNowLiu#10·5 年前

image.png 摸了一下events源码,本质上是data是一个{ [key: string]: Array}类型用来存储事件列表,达到先on的事件先触发

参与回复
登录后即可参与回复。登录