62 lines
1.0 KiB
Go
62 lines
1.0 KiB
Go
|
|
package timer
|
||
|
|
|
||
|
|
import (
|
||
|
|
"sync"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Debouncer 防抖器
|
||
|
|
type Debouncer struct {
|
||
|
|
interval time.Duration
|
||
|
|
callback func()
|
||
|
|
timer *time.Timer
|
||
|
|
mu sync.Mutex
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewDebouncer 创建一个防抖器
|
||
|
|
func NewDebouncer(interval time.Duration, callback func()) *Debouncer {
|
||
|
|
return &Debouncer{
|
||
|
|
interval: interval,
|
||
|
|
callback: callback,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Trigger 触发事件
|
||
|
|
func (d *Debouncer) Trigger() {
|
||
|
|
d.mu.Lock()
|
||
|
|
defer d.mu.Unlock()
|
||
|
|
|
||
|
|
if d.timer != nil {
|
||
|
|
d.timer.Stop()
|
||
|
|
}
|
||
|
|
d.timer = time.AfterFunc(d.interval, d.callback)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Throttler 节流器
|
||
|
|
type Throttler struct {
|
||
|
|
interval time.Duration
|
||
|
|
callback func()
|
||
|
|
lastCalled time.Time
|
||
|
|
mu sync.Mutex
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewThrottler 创建一个节流器
|
||
|
|
func NewThrottler(interval time.Duration, callback func()) *Throttler {
|
||
|
|
return &Throttler{
|
||
|
|
interval: interval,
|
||
|
|
callback: callback,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Trigger 触发事件
|
||
|
|
func (t *Throttler) Trigger() {
|
||
|
|
t.mu.Lock()
|
||
|
|
defer t.mu.Unlock()
|
||
|
|
|
||
|
|
now := time.Now()
|
||
|
|
if now.Sub(t.lastCalled) >= t.interval {
|
||
|
|
go t.callback()
|
||
|
|
t.lastCalled = now
|
||
|
|
}
|
||
|
|
}
|