cubefs
1package util2
3type respErr struct {4errCh chan error5}
6
7func (e *respErr) init() {8e.errCh = make(chan error, 1)9}
10
11func (e *respErr) respond(err error) {12e.errCh <- err13close(e.errCh)14}
15
16func (e *respErr) error() <-chan error {17return e.errCh18}
19
20// Future the future
21type Future struct {22respErr
23respCh chan interface{}24}
25
26func NewFuture() *Future {27f := &Future{28respCh: make(chan interface{}, 1),29}30f.init()31return f32}
33
34func (f *Future) Respond(resp interface{}, err error) {35if err == nil {36f.respCh <- resp37close(f.respCh)38} else {39f.respErr.respond(err)40}41}
42
43// Response wait response
44func (f *Future) Response() (resp interface{}, err error) {45select {46case err = <-f.error():47return48case resp = <-f.respCh:49return50}51}
52
53// AsyncResponse export channels
54func (f *Future) AsyncResponse() (respCh <-chan interface{}, errCh <-chan error) {55return f.respCh, f.errCh56}
57