Как остановить AfterFun c перед выполнением в Golang - PullRequest
0 голосов
/ 29 апреля 2020
var funcTimer *time.Timer

func AddItem(){

   defer funcTimer.Stop()

   funcTimer = time.AfterFunc(1000*time.Millisecond, func() {

        fmt.Println("Executed")

   })

}

Моя цель состоит в том, чтобы попытаться сделать эту функцию дебаузирующей, таким образом, что если она вызывается быстро без задержки, вызов fun c не будет выполняться.

Моя проблема здесь funcTimer.Stop(), кажется, не останавливается time.AfterFunc функция

В javascript эквивалентно этому при использовании ClearTimeout и SetTimeout.

1 Ответ

1 голос
/ 29 апреля 2020

Попробуйте https://github.com/bep/debounce:

код достаточно короткий, чтобы следовать:

func New(after time.Duration) func(f func()) {
    d := &debouncer{after: after}

    return func(f func()) {
        d.add(f)
    }
}

type debouncer struct {
    mu    sync.Mutex
    after time.Duration
    timer *time.Timer
}

func (d *debouncer) add(f func()) {
    d.mu.Lock()
    defer d.mu.Unlock()

    if d.timer != nil {
        d.timer.Stop()
    }
    d.timer = time.AfterFunc(d.after, f)
}

для использования:

debounces := New(100 * time.Millisecond)

debounces(func(){fmt.Println("a")})
debounces(func(){fmt.Println("b")})
debounces(func(){fmt.Println("c")}) // last one wins

https://play.golang.org/p/SOTB-VaGzWC

...