section 5 note taking
아직 한국어 번역이 없습니다. 영문 원문을 표시합니다.
아 어려워 ㅠ
Event Emitter
- extends 확장 상속 inheritance
- class의 instance 생성
- .on() 리스너, 수신기, 특정 event의 이름, 그리고 callback function
- .emit() method, event 발생시키는 역할
.emit(event_name) -> on(event_name)
- node:events(software) -> hardware architecture
-
- Event Emitter 코드는 C++로 작성된 것이 아니다.
-
- V8 Enginex X Libuv X Event Loop X
- event emitter는 하나의 pattern이다.
- publish 발생 -> subscribe 정의
hardware
- CPU Central Processing Unit 연산 + 제어
- RAM Random Access Memory 임시 작업대
- Storage 영구적인 Data 보관소 HDD/SSD
- NIC Network Interface Card 외부의 인터넷 세상과 소통 창구
OS 시스템 전체 통제
- CPU 실제 연산 수행
- 코어 독립적인 작업 단위 1코어 = 오직 1 작업
- 동기식 접근법 Polling 차례대로 돌아가며 계속 묻기
- 비동기식 접근법 Interrupt 전기적 찌름 신호
-
- 정상작업 흐름 가로채고
-
- 아주 잠시 멈춤
- 비동기적 반응원리가 곧 event driven architecture
- 기다리지 않고, 이벤트가 발생할 때만 움직인다.
.emit("event_name") 자체는 synchronous
- System(Libuv, Event loop) 보이지 않는 곳에서 복잡한 비동기 작업 수행
- system(async) -> 완료 신호 -> Event Emitter
Event emitter = {} + []
- 순수 js object 와 array의 조합
-
- c++ 코드가 아니고, 단순 js 원시 타입의 조합
master Object = {}
- 모든 이벤트가 모이는 거대한 본부
- masterObject["event_name"] = []
- 콜백 함수들이 대기할 array 할당
- .push(함수) 콜백 함수 적재 시작
- .emit("event_name") -> masterObject["event_name"]
- event_name을 통해 배열 즉시 검색
- [fn1, fn2, fn3] -> forEach(fn()) 저장된 순서대로 예외없이 모두 실행
emit(..., Data A, Data B)
- fn1(Data A, Data B) 직접 주입 가능
- masterObject["error"] = [errror_manage_fn] 시스템 붕괴를 막는 안전망
- 단 한번만 실행되는 특변한 method once() 1회성 소멸
- {} event 이름 맵핑, dictionary, hashmap 위치를 단번에 파악, 데이터양과 무관하게 검색속도 일정
- [] 리스너 함수들의 목록
Observer Pattern
- on(Event_name, fn) 구독의 시작
- chaining method .on().on().on()
- Closure란 함수가 생성이 될 때 주변환경을 기억하는 것
- .once( ) 는 wrapper fn 을 통해 ...args를 전달하고 .off()를 통해 자신을 제거한다.
- .off()는 뒤에서 앞으로 순회 reverse for loop, using splice
- 인덱스변화에 구애받지 않고 완벽하게 배열 삭제