-
-
Save rynmrtn/aa53c27610f74bca21a7d49fa8c2a76b to your computer and use it in GitHub Desktop.
Golang timeout and tick loop
This file contains 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
// keepDoingSomething will keep trying to doSomething() until either | |
// we get a result from doSomething() or the timeout expires | |
func keepDoingSomething() (bool, error) { | |
timeout := time.After(5 * time.Second) | |
tick := time.Tick(500 * time.Millisecond) | |
// Keep trying until we're timed out or got a result or got an error | |
for { | |
select { | |
// Got a timeout! fail with a timeout error | |
case <-timeout: | |
return false, errors.New("timed out") | |
// Got a tick, we should check on doSomething() | |
case <-tick: | |
ok, err := doSomething() | |
// Error from doSomething(), we should bail | |
if err != nil { | |
return false, err | |
// doSomething() worked! let's finish up | |
} else if ok { | |
return true, nil | |
} | |
// doSomething() didn't work yet, but it didn't fail, so let's try again | |
// this will exit up to the for loop | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment