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

我对某些术语感到困惑。我试图找出 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”。然后我引发启动事件处理过程的事件。事件处理程序似乎确实是异步的,因为即使我们首先注销同步“处理程序中的同步内容”文本,我们也会开始在后台使用线程池来返回稍后读取文件的结果。运行第一个处理程序后,第二个处理程序运行并打印其消息,最后我们打印出最后一条同步消息“最后一个外部”。


因此,我开始尝试证明一些人所说的,即事件处理程序本质上是同步的,然后我发现它们是异步的。我最好的猜测是,要么人们说事件系统是同步的意味着其他意思,要么我有一些概念上的误解。请帮我理解这个问题!


不负相思意
浏览 86回答 1
1回答

哈士奇WWW

该类EventEmitter相对于函数是同步的:事件处理程序是从调用内部emit同步调用的,正如您自己触发的事件所演示的那样。.emit()fire一般来说,通过节点的事件循环来自操作系统(文件和网络操作、计时器等)的事件是异步触发的。您自己不会触发它们,某些本机 API 确实会触发它们。当您监听这些事件时,您可以确定它们不会在下一个刻度之前发生。事件处理程序似乎确实是异步的,因为即使我们首先注销同步“处理程序中的同步内容”文本,我们也会开始在后台使用线程池来返回稍后读取文件的结果是的,您正在调用异步函数readFile(稍后会通知您),但这并不会使您的事件侦听器函数或调用.emit('fire')异步。即使启动后台进程的“异步函数”也会立即(同步)返回一些东西 - 通常什么也没有(undefined)或一个承诺。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript