NODEJS:事件发射器代码在顶级代码之前执行

问题描述 投票:0回答:1

我刚刚开始探索 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');

我的假设和期望是,如果事件发射器进入事件循环,则应该执行顶级代码,然后应该执行事件循环代码(在我们的例子中是事件发射器)。

按照我的预期,下面应该是日志的顺序。

  1. 顶级代码
  2. 收到新销售
  3. 收到 John Doe 29 的新销售

但下面是正在打印的实际日志。

  1. 收到新销售
  2. 收到 John Doe 29 的新销售
  3. 顶级代码

任何有助于理解上述内容的帮助都将不胜感激。

javascript node.js event-loop eventemitter
1个回答
1
投票

来自节点文档: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
© www.soinside.com 2019 - 2024. All rights reserved.