Golang模拟Js中setTimeout与setInterval函数
通过Golang语言模拟javascript中的定时器
在开发中有个场景需要实现js中防抖和节流的效果,但是防抖和节流在js中依赖于setTimeot函数。文末放有链接通过 setTimeout实现防抖和节流的效果
setTimeout函数
可以通过返回的
context.CancelFunc
对象来提前取消定时器
func SetTimeout(timeout int, f func()) context.CancelFunc {
ctx, cancelFunc := context.WithCancel(context.Background())
go func() {
select {
case <-ctx.Done():
case <-time.After(time.Duration(timeout) * time.Second):
f()
}
}()
return cancelFunc
}
setInterval函数
可以通过返回的
context.CancelFunc
对象来取消当前定时器
func SetInterval(timeout int, f func()) context.CancelFunc {
ctx, cancelFunc := context.WithCancel(context.Background())
go func() {
for {
time.Sleep(time.Duration(timeout) * time.Second)
select {
case <-ctx.Done():
return
default:
f()
}
}
}()
return cancelFunc
}
测试案例
package main
import (
"context"
"fmt"
"os"
"time"
)
func main() {
SetTimeout(func() {
fmt.Println("SetTimeout")
}, 5)
interval := SetInterval(func() {
fmt.Println("SetInterval")
}, 2)
time.Sleep(5 * time.Second)
interval()
time.Sleep(10 * time.Second)
}
func SetTimeout(timeout int, f func()) context.CancelFunc {
ctx, cancelFunc := context.WithCancel(context.Background())
go func() {
select {
case <-ctx.Done():
case <-time.After(time.Duration(timeout) * time.Second):
f()
}
}()
return cancelFunc
}
func SetInterval(timeout int, f func()) context.CancelFunc {
ctx, cancelFunc := context.WithCancel(context.Background())
go func() {
for {
time.Sleep(time.Duration(timeout) * time.Second)
select {
case <-ctx.Done():
return
default:
f()
}
}
}()
return cancelFunc
}