Skip to content

debounce

awekrx edited this page May 29, 2026 · 1 revision

debounce

Import

import { debounce } from '@dev-suite/decorators/debounce'

Category

  • method

Use Case

Suppress bursty method calls and run only after quiet period.

Replaces

  • Ad-hoc setTimeout/clearTimeout blocks
  • UI-specific debounce wrappers around domain methods

Example 1

Without decorator

class SearchController {
  private timer?: ReturnType<typeof setTimeout>;

  onInput(query: string) {
    clearTimeout(this.timer);
    this.timer = setTimeout(() => this.search(query), 250);
  }

  private search(query: string) {}
}

With decorator

import { debounce } from '@dev-suite/decorators/debounce';

class SearchController {
  @debounce({ waitMs: 250 })
  onInput(query: string) {
    this.search(query);
  }

  private search(query: string) {}
}

Why better

  • No timer plumbing in controller method.
  • Debounce policy is visible at method boundary.

Example 2

Without decorator

class AutosaveController {
  private timer?: ReturnType<typeof setTimeout>;

  onDraftChange(draft: Draft) {
    clearTimeout(this.timer);
    this.timer = setTimeout(() => this.api.saveDraft(draft), 1000);
  }
}

With decorator

import { debounce } from '@dev-suite/decorators/debounce';

class AutosaveController {
  @debounce({ waitMs: 1000, keyResolver: ([draft]) => String(draft.id) })
  onDraftChange(draft: Draft) {
    this.api.saveDraft(draft);
  }
}

Why better

  • Supports per-entity debounce via keyResolver.
  • Avoids duplicated autosave debounce code.

Clone this wiki locally