| package utils | |
| import ( | |
| "sync" | |
| "time" | |
| ) | |
| var CNLoc = time.FixedZone("UTC", 8*60*60) | |
| func MustParseCNTime(str string) time.Time { | |
| lastOpTime, _ := time.ParseInLocation("2006-01-02 15:04:05 -07", str+" +08", CNLoc) | |
| return lastOpTime | |
| } | |
| func NewDebounce(interval time.Duration) func(f func()) { | |
| var timer *time.Timer | |
| var lock sync.Mutex | |
| return func(f func()) { | |
| lock.Lock() | |
| defer lock.Unlock() | |
| if timer != nil { | |
| timer.Stop() | |
| } | |
| timer = time.AfterFunc(interval, f) | |
| } | |
| } | |
| func NewDebounce2(interval time.Duration, f func()) func() { | |
| var timer *time.Timer | |
| var lock sync.Mutex | |
| return func() { | |
| lock.Lock() | |
| defer lock.Unlock() | |
| if timer == nil { | |
| timer = time.AfterFunc(interval, f) | |
| } | |
| (*time.Timer)(timer).Reset(interval) | |
| } | |
| } | |
| func NewThrottle(interval time.Duration) func(func()) { | |
| var lastCall time.Time | |
| return func(fn func()) { | |
| now := time.Now() | |
| if now.Sub(lastCall) < interval { | |
| return | |
| } | |
| time.AfterFunc(interval, fn) | |
| lastCall = now | |
| } | |
| } | |
| func NewThrottle2(interval time.Duration, fn func()) func() { | |
| var lastCall time.Time | |
| return func() { | |
| now := time.Now() | |
| if now.Sub(lastCall) < interval { | |
| return | |
| } | |
| time.AfterFunc(interval, fn) | |
| lastCall = now | |
| } | |
| } | |