throttle
节流:函数被高频触发时,按固定间隔最多执行一次。首次立即执行(leading),窗口内的最后一次在窗口结束时补上(trailing),保证最终状态不会丢。
适用于滚动、鼠标移动、拖拽这类需要持续反馈的场景。若只关心最终值(搜索联想、自动保存),请用 debounce。
API
throttle(fn, delay?)
参数
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
fn |
要节流的函数 | Function |
必填 |
delay |
最小间隔(毫秒) | number |
300 |
返回
节流后的函数,保留调用处的 this 与参数,并附带:
| 成员 | 说明 | 类型 |
|---|---|---|
cancel() |
取消尾部挂起的那次调用 | () => void |
pending() |
是否有尾部调用在等待 | () => boolean |
示例
import { throttle } from 'ranuts';
const onScroll = throttle(() => update(window.scrollY), 100);
window.addEventListener('scroll', onScroll);
// 销毁时:移除监听 + 取消尾部挂起的调用
window.removeEventListener('scroll', onScroll);
onScroll.cancel();注意
- 首尾都执行:立即跑一次,窗口结束时再用最新参数补一次。
this与参数均从调用处透传。- 哪都能跑:用裸
setTimeout,Node / Web Worker / SSR 均可。 - 每次调用
throttle()拥有独立窗口,两个节流函数不会互相干扰。 - 销毁时务必
cancel(),否则尾部调用会在已销毁的上下文里执行。