cubefs

Форк
0
/
future.go 
56 строк · 901.0 Байт
1
package util
2

3
type respErr struct {
4
	errCh chan error
5
}
6

7
func (e *respErr) init() {
8
	e.errCh = make(chan error, 1)
9
}
10

11
func (e *respErr) respond(err error) {
12
	e.errCh <- err
13
	close(e.errCh)
14
}
15

16
func (e *respErr) error() <-chan error {
17
	return e.errCh
18
}
19

20
// Future the future
21
type Future struct {
22
	respErr
23
	respCh chan interface{}
24
}
25

26
func NewFuture() *Future {
27
	f := &Future{
28
		respCh: make(chan interface{}, 1),
29
	}
30
	f.init()
31
	return f
32
}
33

34
func (f *Future) Respond(resp interface{}, err error) {
35
	if err == nil {
36
		f.respCh <- resp
37
		close(f.respCh)
38
	} else {
39
		f.respErr.respond(err)
40
	}
41
}
42

43
// Response wait response
44
func (f *Future) Response() (resp interface{}, err error) {
45
	select {
46
	case err = <-f.error():
47
		return
48
	case resp = <-f.respCh:
49
		return
50
	}
51
}
52

53
// AsyncResponse export channels
54
func (f *Future) AsyncResponse() (respCh <-chan interface{}, errCh <-chan error) {
55
	return f.respCh, f.errCh
56
}
57

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.