timer/flow.go

62 lines
1.0 KiB
Go
Raw Permalink Normal View History

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
}
}