Chore: picker support get first error

This commit is contained in:
Dreamacro
2020-04-16 18:31:40 +08:00
parent 1825535abd
commit 5c03613858
3 changed files with 20 additions and 3 deletions

View File

@ -15,8 +15,10 @@ type Picker struct {
wg sync.WaitGroup
once sync.Once
result interface{}
once sync.Once
errOnce sync.Once
result interface{}
err error
}
func newPicker(ctx context.Context, cancel func()) *Picker {
@ -49,6 +51,11 @@ func (p *Picker) Wait() interface{} {
return p.result
}
// Error return the first error (if all success return nil)
func (p *Picker) Error() error {
return p.err
}
// Go calls the given function in a new goroutine.
// The first call to return a nil error cancels the group; its result will be returned by Wait.
func (p *Picker) Go(f func() (interface{}, error)) {
@ -64,6 +71,10 @@ func (p *Picker) Go(f func() (interface{}, error)) {
p.cancel()
}
})
} else {
p.errOnce.Do(func() {
p.err = err
})
}
}()
}

View File

@ -36,4 +36,5 @@ func TestPicker_Timeout(t *testing.T) {
number := picker.Wait()
assert.Nil(t, number)
assert.NotNil(t, picker.Error())
}