如何10行代码实现node的events的事件发送和监听
发布于 3 年前 作者 TimLiu1 3669 次浏览 来自 分享

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

@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,基本上是一模一样

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

回到顶部