node.js - Eventemitter代码是否阻塞

标签 node.js eventemitter

我正在开发一个项目,其中有一个 Feed 页面,其中显示所有用户的所有类型的帖子。输入具体列表页面和帖子详细信息页面。

页面- 1. 饲料 2. 列表(特定类型) 3. Detail(帖子的详细信息)

所以我有以下 Mongo 集合 - 1. 饲料 2. 输入 1 帖子 3.类型2帖子 4.输入3...

现在,当用户发布新帖子时,我将其保存到相应的集合中,让我们说“type1 post”并向浏览器返回成功。但我也想用相同的数据更新我的“Feed”集合。我不希望在发送响应之前完成此操作。因为这会增加用户的等待时间。因此我使用了事件。这是我的代码 -

const emitter = new event.EventEmitter();

function savePost(){
    //  Code to save data to Mongo collection

    emitter.emit('addToFeeds', data);
    console.log('emit done');

    return res.json(data);
}

emitter.on('addToFeeds', function(data){
    // code to save data to Feeds collection
    console.log('emitter msg - ', data);
});

现在,当我检查 console.log 输出时,它首先显示“emitter msg -”,然后显示“emit done”。这就是为什么我假设emitter.on代码在res.json(data);之前执行

现在我想知道事件是否会阻止代码?如果我必须在后台或发送回复后更新源,正确的方法是什么?将来我还想实现缓存,因此即使添加帖子,我也必须更新缓存,我也想在发送响应后或在后台执行此操作。

最佳答案

是的,事件是同步且阻塞的。它们是通过简单的函数调用来实现的。如果您查看 eventEmitter 代码,为了向所有监听器发送事件,它实际上只是循环访问监听器数组并一个接一个地调用每个监听器回调。

Now I'm wondering does Events are blocking code?

是的。在 doc for .emit() ,它是这样写的:“按照注册顺序同步调用为名为 eventName 的事件注册的每个监听器,并将提供的参数传递给每个监听器。”

并且,本节文档中的更多信息 Asynchronous vs. Synchronous其中写着:

EventEmitter 按照注册顺序同步调用所有监听器。这对于确保事件的正确排序并避免竞争条件或逻辑错误非常重要。在适当的情况下,监听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:

If I have to update Feeds in background or after response is sent what is the right way?

您的 eventListener 可以使用 setTimeout()setImmediate()process.nextTick() 安排何时实际执行其代码 code> 如果它希望其他监听器和其他同步代码在其工作之前完成运行。因此,您注册一个普通的监听器(它将被同步调用),然后在其中,您可以使用 setTimeout()setImmediate()process。 nextTick() 并将实际工作放入该回调中。这将延迟运行您的代码,直到触发初始事件的当前 Javascript 运行完毕。

node.js 中没有针对纯 Javascript 代码的实际“后台处理”。 node.js 是单线程的,因此当您运行某些 Javascript 时,其他 Javascript 无法运行。实际的后台处理必须使用现有的异步操作(使用 native 代码在后台运行事物)(例如网络 I/O 或磁盘 I/O)或通过运行另一个进程来完成工作(该其他进程)来完成可以是任何类型的代码,包括另一个 Node.js 进程)。

关于node.js - Eventemitter代码是否阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50294746/

相关文章:

node.js - Sequelize 迁移重新创建表

javascript - 中间件无法连接 HTTP 服务器

javascript - Node.js EventEmitter 无法立即发出

javascript - 如何为 NodeJS 中的事件扩展对象文字对象?

javascript - 使用 Facebook 的 EventEmitter 有没有办法让迟到的监听器接收到已经发出的事件?

Angular 从子组件传递值以禁用父组件中的按钮

angularjs - Protractor 异步/等待 UnhandledPromiseRejectionWarning : Unhandled promise rejection

mysql - 自定义快速验证器

javascript - typescript 不会替换 tsconfig 中定义的非相对路径

node.js - Express 服务器上的 RSS 订阅实现