nodejs里socket.on和socket.once的单步调试

一个网友的求助:
https://stackoverflow.com/questions/49788422/socket-on-event-gets-triggered-multiple-times
其他朋友建议他用socket.once, 而非socket.on

nodejs里socket.on和socket.once的单步调试_第1张图片

socket对象本身并没有on的方法:

nodejs里socket.on和socket.once的单步调试_第2张图片

原型链上才有:

nodejs里socket.on和socket.once的单步调试_第3张图片

执行on(“createKOIID”, fn)之前的监听事件函数池:

nodejs里socket.on和socket.once的单步调试_第4张图片

使用on注册之后:

nodejs里socket.on和socket.once的单步调试_第5张图片

nodejs里socket.on和socket.once的单步调试_第6张图片

nodejs里socket.on和socket.once的单步调试_第7张图片

nodejs里socket.on和socket.once的单步调试_第8张图片

nodejs里socket.on和socket.once的单步调试_第9张图片

nodejs里socket.on和socket.once的单步调试_第10张图片

nodejs里socket.on和socket.once的单步调试_第11张图片

再看once的实现:
on是一个函数,once传入的监听函数作为一个属性赋值到on上:

nodejs里socket.on和socket.once的单步调试_第12张图片

然后照常用on注册事件:

nodejs里socket.on和socket.once的单步调试_第13张图片

注册完毕。
事件触发时,首先执行on:

nodejs里socket.on和socket.once的单步调试_第14张图片

在on里面会先解除掉对event的注册:

nodejs里socket.on和socket.once的单步调试_第15张图片

第1600行会把事件处理函数从handler repository里移除掉。

最后执行对应的事件处理函数。

nodejs里socket.on和socket.once的单步调试_第16张图片

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

你可能感兴趣的:(nodejs)