jsrosetta

Hướng đối tượng

Event Emitter

EventEmitter của Node.js so với NotificationCenter (Swift), map callback tự viết (Rust, Java) và channel kết hợp select trong Go.

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.58Swift ≥ 3.0Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Node.js có EventEmitter built-in: đăng ký listener bằng .on(), phát sự kiện bằng .emit(). Swift có NotificationCenter trong Foundation — cùng ý tưởng tên sự kiện + observer, và là API dựng sẵn gần nhất với EventEmitter trong cả năm ngôn ngữ. Rust và Java không có gì dựng sẵn, nhưng tự viết một map tên-sự-kiện → danh sách callback là chuyện vài dòng. Go không có EventEmitter — thứ gần nhất là dùng channel kết hợp goroutine và select để lắng nghe nhiều "kênh sự kiện" cùng lúc.

EventEmitter (Node.js) vs channel + select (Go)

import { EventEmitter } from 'node:events'
 
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter()
 
myEmitter.on('my-event', msg => {
  console.log(msg)
})
 
myEmitter.on('my-other-event', msg => {
  console.log(msg)
})
 
myEmitter.emit('my-event', 'hello world')
myEmitter.emit('my-other-event', 'hello other world')
// hello world
// hello other world

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#event-emitter