프로그래밍을 하다보면 emit() 이라는 함수를 자주 보게 됩니다.

우리말로 emit 은 “방출하다” 로 번역할 수 있습니다.

스택오버플에 emit을 컴퓨터 사이언스에서 일반적으로 어떻게 해석하는지에 대한 질문도 존재합니다.

https://stackoverflow.com/questions/31270657/what-does-emit-mean-in-general-computer-science-terms

emit() 는 보통 등록된 이벤트들을 실행시키는 함수 라고 생각하면 됩니다.

( 등록한 이벤트를 방출한다. 로 이해하면 될듯 합니다. )

emit 을 구현한 코드들도 많이 있는데 php 로 구현된 EventEmitter를 보도록 합시다.

https://github.com/igorw/evenement/blob/master/src/Evenement/EventEmitterTrait.php

public function emit($event, array $arguments = [])
    {
        if ($event === null) {
            throw new \InvalidArgumentException('event name must not be null');
        }

        $beforeOnceListeners = [];
        if (isset($this->beforeOnceListeners[$event])) {
            $beforeOnceListeners = \array_values($this->beforeOnceListeners[$event]);
        }

        $listeners = [];
        if (isset($this->listeners[$event])) {
            $listeners = \array_values($this->listeners[$event]);
        }

        $onceListeners = [];
        if (isset($this->onceListeners[$event])) {
            $onceListeners = \array_values($this->onceListeners[$event]);
        }

        if(empty($beforeOnceListeners) === false) {
            unset($this->beforeOnceListeners[$event]);
            foreach ($beforeOnceListeners as $listener) {
                $listener(...$arguments);
            }
        }

        if(empty($listeners) === false) {
            foreach ($listeners as $listener) {
                $listener(...$arguments);
            }
        }

        if(empty($onceListeners) === false) {
            unset($this->onceListeners[$event]);
            foreach ($onceListeners as $listener) {
                $listener(...$arguments);
            }
        }

        foreach ($this->children as $child) {
            $child->emit($event, $arguments);
        }
    }

event 종류에 따라 다르게 동작하는 (한번만 실행한다던지…) 기능들이 있지만 결과적으로는 등록된 이벤트를 실행하는걸 볼 수있습니다.

dart 언어로는 Broadcast Stream 을 이용하여 다음과 같이 간단하게 구현해 볼 수 있습니다.

import 'dart:async';

main() async {
  final StreamController ctrl = StreamController<int>.broadcast();

  var event1 = (data) {
    print("event1 executed, data : $data" );
  };
  var event2 = (data) {
    print("event2 executed, data : $data" );
  };

  final StreamSubscription subscription1 = ctrl.stream.listen((data) => event1(data));
  final StreamSubscription subscription2 = ctrl.stream.listen((data) => event2(data));

  for (int i = 1; i <= 3; i++) {
    ctrl.sink.add(i);
  }

  ctrl.close();

  await Future.delayed(const Duration(seconds: 1), () {});
}