我学习一下node,js中事件触发的类型里面的知识,有谁知道怎样看,教我一下
发布于 3 个月前 作者 sunboy25 1465 次浏览 来自 问答

我想问下像这样的事件注册函数emitter.on(eventName, listener),里的eventName可以有哪些,怎样查看?

14 回复

eventName 不是自定义的吗?

@guojingkang 你们是怎么知道的,是官网说明上写的吗?

image.png

emitter.on 函数要求 eventName 类型是字符串或者 symbol 即可,如果有明确的枚举值,会有说明的,下面举例也用到了 foo 。。。

@guojingkang 是不是使用一些固定事件名就不需要在另外编写触发函数触发它?我怎么上传不了图片,怪事! Event: 'abort’ Event: 'connect’ Event: 'continue’ Event: 'information’ Event: 'response’ Event: 'socket’ Event: 'timeout’ Event: ‘upgrade’

@sunboy25 image.png

Event 是一个可以继承的类,每个 event 实例都有最基本的 on 和 emit 函数用来注册和触发事件,至于具体注册和触发什么的,由开发者本身去决定。比如我截图的这个,有若干个事件,是因为 NodeJs 源码中,http.server 继承了 event ,并注册了这些事件。不同的模块不同的类,nodeJs 源码给注册的事件是不同的。

@guojingkang q我想再问一下,你截图中http.server类下面的都叫事件吗?我原先以为写着事件的才叫事件呢,怪不得理解不了,另外这些事件在server.on(event,fun)时是不是都可以省略前面的sever,比如server.listening写成server.on(listening,fun)的形式?

@sunboy25 写着是事件的才是事件,其他的不是

@guojingkang 那我就想不通了我这个server.on(listening,fun),这个listening事件是从那里来的,我只在net中net.server类中看到有这个事件。它怎么能用到这里的,net和http之间有什么联系吗?

@sunboy25 event 你可以理解为是一个数据结构,这个数据结构下面维护了这么一个 map

const eventsMap = {};
emitter.on = (eventName, fn) => {
	if(eventsMap[eventName]){
		eventsMap[eventName].push(fn)
	}else{
		eventsMap[eventName] = [fn]
	}
}

emitter.emit = ( eventName, args) => {
	eventsMap[eventName].forEach((fn) => {
		fn.call(this,args)
	})
}

@guojingkang 能不能把这个map位置发我一下的,我想看一下源码,这样是不是就能知道有多少事件可以用了?

@sunboy25 github nodeJs 仓库里面,events.js

回到顶部