/
example_future_test.go
executable file
·61 lines (47 loc) · 1.4 KB
/
example_future_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package eventual2go_test
import (
"errors"
"fmt"
"time"
"github.com/joernweissenborn/eventual2go"
)
// Demonstrates the basic usage of futures
func ExampleFuture() {
// create the completers, one we will complete with error, the other normaly.
completerNor := eventual2go.NewCompleter[string]()
completerErr := eventual2go.NewCompleter[string]()
// set up success handler
var onsuccess eventual2go.CompletionHandler[string] = func(d string) {
fmt.Println("SUCESS:", d)
}
// set up error handler
var onerror eventual2go.ErrorHandler = func(e error) {
fmt.Println("ERROR:", e)
}
// our long running async func
mylongrunning := func(do_err bool, c *eventual2go.Completer[string]) {
time.Sleep(1 * time.Second)
if do_err {
c.CompleteError(errors.New("Hello Future Error"))
} else {
c.Complete("Hello Future")
}
}
// get the futures
fNor := completerNor.Future()
fErr := completerErr.Future()
// register the handlers
// we chain the succes
fNor.Then(onsuccess)
fNor.Err(onerror)
fErr.Then(onsuccess)
fErr.Err(onerror)
// execute the functions
go mylongrunning(false, completerNor)
go mylongrunning(true, completerErr)
// wait for futures to complete
fNor.WaitUntilComplete()
fErr.WaitUntilComplete()
// everything is async, so the future is maybe complete, but the handlers must not have been executed necessarily, so we wait 10 ms
time.Sleep(10 * time.Millisecond)
}