Shr*_*ant 7 node.js eventemitter
我正在开发一个项目,其中有一个 Feed 页面,其中显示所有用户的所有类型的帖子。输入具体列表页面和帖子详细信息页面。
页面 - 1. 提要 2. 列表(特定于类型) 3. 详细信息(帖子的详细信息)
所以我有以下 Mongo 集合 - 1. Feed 2. type1 post 3. type2 post 4. type3...
现在,当用户发布新帖子时,我将其保存到相应的集合中,让我们说“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);
});
Run Code Online (Sandbox Code Playgroud)
现在,当我检查 console.log 输出时,它首先显示“emitter msg -”,然后显示“emit done”。这就是为什么我假设 emitter.on 代码在 res.json(data); 之前执行。
现在我想知道事件是否会阻止代码?如果我必须在后台或发送回复后更新源,正确的方法是什么?将来我还想实现缓存,因此即使添加帖子,我也必须更新缓存,我也想在发送响应后或在后台执行此操作。
jfr*_*d00 12
是的,事件是同步且阻塞的。它们是通过简单的函数调用来实现的。如果您查看 eventEmitter 代码,为了向所有侦听器发送事件,它实际上只是循环访问侦听器数组并一个接一个地调用每个侦听器回调。
现在我想知道事件是否会阻止代码?
是的。在.emit() 的文档中,它是这样说的:“按照注册的顺序,同步调用为名为 eventName 的事件注册的每个侦听器,并将提供的参数传递给每个侦听器。”
并且,本节异步与同步的文档中的更多信息如下:
EventEmitter 按照注册顺序同步调用所有侦听器。这对于确保事件的正确排序并避免竞争条件或逻辑错误非常重要。在适当的情况下,侦听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:
如果我必须在后台或发送回复后更新源,正确的方法是什么?
setTimeout()您的 eventListener 可以安排何时使用 a或 a实际执行其代码setImmediate(),或者process.nextTick()是否希望其他侦听器和其他同步代码在其工作之前完成运行。因此,您注册一个普通的侦听器(它将被同步调用),然后在其中,您可以使用setTimeout()orsetImmediate()或process.nextTick()并将实际工作放入该回调中。这将延迟运行您的代码,直到触发初始事件的当前 Javascript 运行完毕。
对于纯 Javascript 代码,node.js 中没有实际的“后台处理”。node.js 是单线程的,因此当您运行某些 Javascript 时,其他 Javascript 无法运行。实际的后台处理必须使用现有的异步操作(使用本机代码在后台运行事物)(例如网络 I/O 或磁盘 I/O)或通过运行另一个进程来完成工作(该其他进程)来完成可以是任何类型的代码,包括另一个 Node.js 进程)。
| 归档时间: |
|
| 查看次数: |
6110 次 |
| 最近记录: |