node-interview icon indicating copy to clipboard operation
node-interview copied to clipboard

关于Events

Open royIdoodle opened this issue 5 years ago • 3 comments

url:https://elemefe.github.io/node-interview/#/sections/zh-cn/event-async Events 中 有下面的描述

以及这样会不会死循环?

const EventEmitter = require('events');

let emitter = new EventEmitter();

emitter.on('myEvent', function sth () {
// 下面的代码是不是写错了?应该是 emitter.emit('myEvent')吧
  emitter.on('myEvent', sth);
  console.log('hi');
});

emitter.emit('myEvent');

能否再进一步解释一下,两种事件触发有啥区别?

royIdoodle avatar Dec 27 '19 08:12 royIdoodle

一个是监听里触发,一个是在监听里面监听,后者不会死循环,emit的时候相当于创建了一个原事件队列的复制去执行,再监听会加入队列,但之前的队列已经被复制好了.可以看看这里

GaleLQ avatar Jan 14 '20 07:01 GaleLQ

从 events 的文档来看,我觉得作者的代码没有写错,这里就是这么来考察的。

JianmingXia avatar Mar 02 '20 02:03 JianmingXia

一个是监听里触发,一个是在监听里面监听,后者不会死循环,emit的时候相当于创建了一个原事件队列的复制去执行,再监听会加入队列,但之前的队列已经被复制好了.可以看看这里

就是在 emit 执行的时候,会把之前注册好的回调列表复制副本取出执行,但是在 cb 里面继续在添加监听回调的话,会在原有的 listeners 里面继续添加,但是不会执行;因为执行的 callback list 和推入的 callbacklist 实际上内存中的引用不是同一个了.

image

cjfff avatar Jul 21 '21 02:07 cjfff