为了账号安全,请及时绑定邮箱和手机立即绑定

所有事件处理程序同步触发是什么意思?

所有事件处理程序同步触发是什么意思?

不负相思意 2023-09-14 18:19:11
我对某些术语感到困惑。我试图找出 Node.js 的事件系统实际上是如何工作的,并且在很多地方我读到事件处理程序是完全同步的。对我来说,这似乎很奇怪,因为使用事件驱动方法的优点之一是主线程不会被事件阻塞。所以我试着想出我自己的例子,看起来发生的事情正是我真正期望的:const fs = require('fs')const util = require('util')const readFile = util.promisify(fs.readFile)const events = require('events')const emitter = new events.EventEmitter()emitter.on('fire', () => {  readFile('bigFile.txt')    .then(() => console.log('Done reading bigFile.txt'))    .catch(error => console.log(error))  console.log('Sync thing in handler')})emitter.on('fire', () => {  console.log('Second handler')})console.log('First outside')emitter.emit('fire')console.log('Last outside')请注意,bigFile.txt实际上是一个很大的文本文件,在我的计算机上处理它需要几百毫秒。这里我首先同步注销“Firstoutside”。然后我引发启动事件处理过程的事件。事件处理程序似乎确实是异步的,因为即使我们首先注销同步“处理程序中的同步内容”文本,我们也会开始在后台使用线程池来返回稍后读取文件的结果。运行第一个处理程序后,第二个处理程序运行并打印其消息,最后我们打印出最后一条同步消息“最后一个外部”。因此,我开始尝试证明一些人所说的,即事件处理程序本质上是同步的,然后我发现它们是异步的。我最好的猜测是,要么人们说事件系统是同步的意味着其他意思,要么我有一些概念上的误解。请帮我理解这个问题!
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

该类EventEmitter相对于函数是同步的:事件处理程序是从调用内部emit同步调用的,正如您自己触发的事件所演示的那样。.emit()fire

一般来说,通过节点的事件循环来自操作系统(文件和网络操作、计时器等)的事件是异步触发的。您自己不会触发它们,某些本机 API 确实会触发它们。当您监听这些事件时,您可以确定它们不会在下一个刻度之前发生。

事件处理程序似乎确实是异步的,因为即使我们首先注销同步“处理程序中的同步内容”文本,我们也会开始在后台使用线程池来返回稍后读取文件的结果

是的,您正在调用异步函数readFile(稍后会通知您),但这并不会使您的事件侦听器函数或调用.emit('fire')异步。即使启动后台进程的“异步函数”也会立即(同步)返回一些东西 - 通常什么也没有(undefined)或一个承诺。



查看完整回答
反对 回复 2023-09-14
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信