Created
October 12, 2019 03:19
-
-
Save xigang/1ee347385937c8707b9ccbd8758d9c95 to your computer and use it in GitHub Desktop.
retry.go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type ConditionFunc func() (bool, error) | |
// Retry retries f every interval until after maxRetries. | |
// The interval won't be affected by how long f takes. | |
// For example, if interval is 3s, f takes 1s, another f will be called 2s later. | |
// However, if f takes longer than interval, it will be delayed. | |
func Retry(interval time.Duration, maxRetries int, f ConditionFunc) error { | |
if maxRetries <= 0 { | |
return fmt.Errorf("maxRetries (%d) should be > 0", maxRetries) | |
} | |
tick := time.NewTicker(interval) | |
defer tick.Stop() | |
for i := 0; ; i++ { | |
ok, err := f() | |
if err != nil { | |
return err | |
} | |
if ok { | |
return nil | |
} | |
if i == maxRetries { | |
break | |
} | |
<-tick.C | |
} | |
return &RetryError{maxRetries} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment