본문으로 이동

이벤트

모든 컨텍스트에 혼합되는 이벤트 디스패치 API입니다. Harness 이벤트 선언과 해당 디스패치 모드는 각 소유 하위 시스템 페이지에 생성됩니다.

ctx.parallel(name, ...args)

ts
/**
 * Dispatch an event, running all listeners concurrently.
 *
 * @param name — the event name.
 * @param args — arguments passed to every listener.
 * @returns a promise resolving once every listener has settled.
 */
parallel<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promise<void>
parallel<K extends keyof Events>(thisArg: NoInfer<ThisType<Events[K]>>, name: K, ...args: Parameters<Events[K]>): Promise<void>

이벤트를 디스패치하고 모든 리스너를 동시에 실행합니다.

  • name — 이벤트 이름입니다.
  • args — 모든 리스너에 전달되는 인수입니다.

반환값 모든 리스너가 완료되면 이행되는 promise입니다.

소스

ctx.emit(name, ...args)

ts
/**
 * Dispatch an event synchronously, ignoring listener return values.
 *
 * @param name — the event name.
 * @param args — arguments passed to every listener.
 */
emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void
emit<K extends keyof Events>(thisArg: NoInfer<ThisType<Events[K]>>, name: K, ...args: Parameters<Events[K]>): void

리스너의 반환값을 무시하고 이벤트를 동기적으로 디스패치합니다.

  • name — 이벤트 이름입니다.
  • args — 모든 리스너에 전달되는 인수입니다.

소스

ctx.serial(name, ...args)

ts
/**
 * Dispatch an event, awaiting listeners in order until one bails.
 *
 * @param name — the event name.
 * @param args — arguments passed to each listener.
 * @returns the first bail value (non-null, non-false, non-undefined), if any.
 */
serial<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>
serial<K extends keyof Events>(thisArg: NoInfer<ThisType<Events[K]>>, name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>

이벤트를 디스패치하고, 하나가 bail할 때까지 리스너를 순서대로 기다립니다.

  • name — 이벤트 이름입니다.
  • args — 각 리스너에 전달되는 인수입니다.

반환값 있는 경우 첫 번째 bail 값(non-null, non-false, non-undefined)입니다.

소스

ctx.bail(name, ...args)

ts
/**
 * Dispatch an event, calling listeners in order until one bails.
 *
 * @param name — the event name.
 * @param args — arguments passed to each listener.
 * @returns the first bail value (non-null, non-false, non-undefined), if any.
 */
bail<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>
bail<K extends keyof Events>(thisArg: NoInfer<ThisType<Events[K]>>, name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>

이벤트를 디스패치하고, 하나가 bail할 때까지 리스너를 순서대로 호출합니다.

  • name — 이벤트 이름입니다.
  • args — 각 리스너에 전달되는 인수입니다.

반환값 있는 경우 첫 번째 bail 값(non-null, non-false, non-undefined)입니다.

소스

ctx.waterfall(name, ...args)

ts
/**
 * Dispatch an event whose last argument is a `next` continuation.
 *
 * Each listener wraps the rest of the chain: calling `next()` invokes the
 * next listener (finally the built-in behavior); not calling it vetoes.
 *
 * @param name — the event name.
 * @param args — listener arguments; the final one is the innermost `next`.
 * @returns the outermost listener's return value.
 */
waterfall<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>
waterfall<K extends keyof Events>(thisArg: NoInfer<ThisType<Events[K]>>, name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>

마지막 인수가 next 연속 호출인 이벤트를 디스패치합니다.

각 리스너는 체인의 나머지 부분을 감쌉니다. next()을 호출하면 다음 리스너(마지막에는 기본 제공 동작)가 호출되고, 호출하지 않으면 거부됩니다.

  • name — 이벤트 이름입니다.
  • args — 리스너 인수이며, 마지막 인수는 가장 안쪽의 next입니다.

반환값 가장 바깥쪽 리스너의 반환값입니다.

소스

ctx.on(name, listener, options?)

ts
/**
 * Register an event listener owned by the current fiber.
 *
 * @param name — the event name to listen for.
 * @param listener — called with the dispatch arguments.
 * @param options — listener options; a boolean is shorthand for `prepend`.
 * @returns a disposer removing the listener; `true` if it was still registered.
 */
on<K extends keyof Events>(name: K, listener: Events[K], options?: boolean | EventOptions): () => boolean

현재 fiber가 소유하는 이벤트 리스너를 등록합니다.

  • name — 수신할 이벤트 이름입니다.
  • listener — 디스패치 인수와 함께 호출됩니다.
  • options — 리스너 옵션이며, boolean은 prepend의 축약형입니다.

반환값 리스너를 제거하는 disposer이며, 여전히 등록되어 있었다면 true입니다.

소스

ctx.once(name, listener, options?)

ts
/**
 * Same as `on()`, but the listener disposes itself after its first call.
 *
 * @param name — the event name to listen for.
 * @param listener — called at most once with the dispatch arguments.
 * @param options — listener options; a boolean is shorthand for `prepend`.
 * @returns a disposer removing the listener; `true` if it was still registered.
 */
once<K extends keyof Events>(name: K, listener: Events[K], options?: boolean | EventOptions): () => boolean

on()와 같지만, 리스너는 처음 호출된 후 자신을 해제합니다.

  • name — 수신할 이벤트 이름입니다.
  • listener — 디스패치 인수와 함께 최대 한 번 호출됩니다.
  • options — 리스너 옵션이며, boolean은 prepend의 축약형입니다.

반환값 리스너를 제거하는 disposer이며, 여전히 등록되어 있었다면 true입니다.

소스

EventOptions

ctx.on()ctx.once()에서 허용하는 옵션입니다.

ts
/** Options accepted by `ctx.on()` and `ctx.once()`. */
interface EventOptions {
  /** Add the listener before existing listeners for the same event. */
  prepend?: boolean
  /** Receive the event regardless of context filter checks. */
  global?: boolean
}

소스

DispatchMode

이벤트 서비스에서 사용하는 이벤트 디스패치 전략입니다.

emit은 리스너를 기다리지 않고 동기 리스너를 실행하고, parallel는 모든 리스너를 함께 기다리며, serial은 하나가 bail할 때까지 순서대로 기다리고, bail은 첫 번째 동기 bail 값에서 중지하며, waterfall은 최종 next 콜백을 중심으로 리스너를 구성합니다.

ts
/**
 * Event dispatch strategy used by the event service.
 *
 * `emit` runs synchronous listeners without awaiting them, `parallel` awaits
 * all listeners together, `serial` awaits them in order until one bails,
 * `bail` stops on the first synchronous bail value, and `waterfall` composes
 * listeners around a final `next` callback.
 */
type DispatchMode = 'emit' | 'parallel' | 'serial' | 'bail' | 'waterfall'

소스