我刚刚开始探索 Node JS 事件驱动架构和事件循环,我从一些博客中了解到事件发射器进入事件循环,这应该是异步的,但是当我在下面执行时,我看到事件发射器首先被记录,然后是顶部级别代码。
const EventEmitter = require("events");
const myEmitter = new EventEmitter();
myEmitter.on('newSale', () => {
console.log('New sale received');
})
myEmitter.on('newSale', (saleValue) => {
console.log('New sale received from John Doe', + saleValue);
})
myEmitter.emit('newSale', 29);
console.log('Top level code');
我的假设和期望是,如果事件发射器进入事件循环,则应该执行顶级代码,然后应该执行事件循环代码(在我们的例子中是事件发射器)。
按照我的预期,下面应该是日志的顺序。
但下面是正在打印的实际日志。
任何有助于理解上述内容的帮助都将不胜感激。
来自节点文档:https://nodejs.org/api/events.html
EventEmitter 按照注册顺序同步调用所有侦听器
当
EventEmitter
对象发出事件时,附加到该特定事件的所有函数都会被同步调用。要使其异步,您必须使用setImmediate()
或process.nextTick()
方法。
更多信息:https://nodejs.org/api/events.html#asynchronous-vs-synchronous
const EventEmitter = require("events");
const myEmitter = new EventEmitter();
myEmitter.on('newSale', () => {
setImmediate(() => {
console.log('New sale received');
});
});
myEmitter.on('newSale', (saleValue) => {
setImmediate(() => {
console.log('New sale received from John Doe', + saleValue);
});
});
myEmitter.emit('newSale', 29);
console.log('Top level code');
上面的脚本将按照您的预期打印输出。
Top level code
New sale received
New sale received from John Doe 29