@modern-kit/utils
Version:
1 lines • 3.5 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/common/throttle/index.ts"],"sourcesContent":["import { debounce } from '../debounce';\n\ninterface ThrottleOptions {\n signal?: AbortSignal;\n leading?: boolean;\n trailing?: boolean;\n}\n\ninterface ThrottledFunction<F extends (...args: any[]) => void> {\n (...args: Parameters<F>): void;\n cancel: () => void;\n flush: () => void;\n}\n\n/**\n * @description 스로틀링된 함수를 생성합니다.\n *\n * 스로틀링된 함수는 첫 번째 호출은 즉시 실행 되고, 이후 지연 시간(`wait` 밀리초) 간격으로만 실행됩니다.\n * 지정된 시간 간격마다 최대 한 번만 실행하여 호출 빈도를 제한합니다.\n *\n * @param {F} func - 스로틀링할 함수입니다.\n * @param {number} wait - 스로틀링 간격(밀리초)입니다.\n * @param {ThrottleOptions} options - 스로틀링 옵션입니다.\n * @param {AbortSignal} options.signal - 스로틀링 취소를 위한 AbortSignal입니다.\n * @param {boolean} options.leading - 첫 번째 호출을 실행할지 여부입니다.\n * @param {boolean} options.trailing - 마지막 호출을 실행할지 여부입니다.\n *\n * @returns {ThrottledFunction<F>} `cancel` 메서드가 포함된 새로운 스로틀링된 함수를 반환합니다.\n * - `cancel` 메서드는 스로틀링된 함수의 대기 중인 실행을 취소합니다.\n * - `flush` 메서드는 대기 중인 실행이 있는 경우 스로틀링된 함수를 즉시 실행합니다.\n *\n * @example\n * const throttled = throttle(func, 1000);\n * throttled(); // 즉시 실행\n * throttled(); // 이후 호출은 지연 시간 간격으로 실행됩니다.\n *\n * @example\n * // AbortSignal 사용 예시\n * const controller = new AbortController();\n * controller.abort(); // 스로틀링된 함수 호출을 취소합니다.\n *\n * const throttled = throttle(func, 1000, { signal: controller.signal });\n * throttled(); // 호출되지 않습니다.\n */\nexport function throttle<F extends (...args: any[]) => void>(\n func: (...args: any[]) => void,\n wait: number,\n options: ThrottleOptions = {}\n): ThrottledFunction<F> {\n const { signal, leading = true, trailing = true } = options;\n const debounced = debounce(func, wait, { signal, leading, trailing });\n\n let pendingAt: number | null = null;\n\n const throttled = function (...args: Parameters<F>) {\n const now = Date.now();\n\n if (pendingAt == null) {\n pendingAt = now;\n } else {\n if (now - pendingAt >= wait) {\n pendingAt = now;\n debounced.cancel();\n }\n }\n debounced(...args);\n };\n\n throttled.cancel = debounced.cancel;\n throttled.flush = debounced.flush;\n\n return throttled;\n}\n"],"names":["debounce"],"mappings":";;;;AA4CO,SAAS,QAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,GAA2B,EAAC,EACN;AACtB,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,GAAU,IAAA,EAAM,QAAA,GAAW,MAAK,GAAI,OAAA;AACpD,EAAA,MAAM,SAAA,GAAYA,wBAAS,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AAEpE,EAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,YAAa,IAAA,EAAqB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,SAAA,GAAY,GAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAI,GAAA,GAAM,aAAa,IAAA,EAAM;AAC3B,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,SAAA,CAAU,MAAA,EAAO;AAAA,MACnB;AAAA,IACF;AACA,IAAA,SAAA,CAAU,GAAG,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,SAAA,CAAU,SAAS,SAAA,CAAU,MAAA;AAC7B,EAAA,SAAA,CAAU,QAAQ,SAAA,CAAU,KAAA;AAE5B,EAAA,OAAO,SAAA;AACT;;;;"}