亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

所有事件處理程序同步觸發是什么意思?

所有事件處理程序同步觸發是什么意思?

不負相思意 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 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號