77[ ![ Maintainability] ( https://api.codeclimate.com/v1/badges/72fe9626fb821fc70251/maintainability )] ( https://codeclimate.com/github/fillmore-labs/async-exp/maintainability )
88[ ![ Go Report Card] ( https://goreportcard.com/badge/fillmore-labs.com/exp/async )] ( https://goreportcard.com/report/fillmore-labs.com/exp/async )
99[ ![ License] ( https://img.shields.io/github/license/fillmore-labs/exp-async )] ( https://www.apache.org/licenses/LICENSE-2.0 )
10+ [ ![ FOSSA Status] ( https://app.fossa.com/api/projects/git%2Bgithub.com%2Ffillmore-labs%2Fasync-exp.svg?type=shield&issueType=license )] ( https://app.fossa.com/projects/git%2Bgithub.com%2Ffillmore-labs%2Fasync-exp )
1011
1112The ` async ` package provides interfaces and utilities for writing asynchronous code in Go.
1213
1314## Motivation
1415
15- Futures and promises are constructs used for asynchronous and concurrent programming, allowing developers to work with
16- values that may not be immediately available and can be evaluated in a different execution context.
17-
18- Go is known for its built-in concurrency features like goroutines and channels.
19- The select statement further allows for efficient multiplexing and synchronization of multiple channels, thereby
20- enabling developers to coordinate and orchestrate asynchronous operations effectively.
21- Additionally, the context package offers a standardized way to manage cancellation, deadlines, and timeouts within
22- concurrent and asynchronous code.
23-
24- On the other hand, Go's error handling mechanism, based on explicit error values returned from functions, provides a
25- clear and concise way to handle errors.
26-
27- The purpose of this package is to provide a thin layer over channels which simplifies the integration of concurrent
28- code while providing a cohesive strategy for handling asynchronous errors.
29- By adhering to Go's standard conventions for asynchronous and concurrent code, as well as error propagation, this
30- package aims to enhance developer productivity and code reliability in scenarios requiring asynchronous operations.
16+ This is an experimental package which has a similar API as
17+ [ fillmore-labs.com/promise] ( https://pkg.go.dev/fillmore-labs.com/promise ) , but is implemented with a structure instead.
3118
3219## Usage
3320
@@ -37,18 +24,19 @@ address (see [GetMyIP](#getmyip) for an example).
3724Now you can do
3825
3926``` go
40- ctx , cancel := context.WithTimeout (context.Background (), 5 *time.Second )
27+ ctx , cancel := context.WithTimeout (context.Background (), 2 *time.Second )
4128 defer cancel ()
4229
43- future := async.NewFutureAsync (func () (string , error ) {
44- return getMyIP (ctx)
45- })
30+ query := func () (string , error ) {
31+ return getMyIP (ctx) // Capture context with timeout
32+ }
33+ future := async.NewAsync (query)
4634```
4735
4836and elsewhere in your program, even in a different goroutine
4937
5038``` go
51- if ip , err := future.Wait (ctx); err == nil {
39+ if ip , err := future.Await (ctx); err == nil {
5240 slog.Info (" Found IP" , " ip" , ip)
5341 } else {
5442 slog.Error (" Failed to fetch IP" , " error" , err)
@@ -77,27 +65,15 @@ func getMyIP(ctx context.Context) (string, error) {
7765 }
7866 defer func () { _ = resp.Body .Close () }()
7967
80- ipResponse := & struct {
68+ ipResponse := struct {
8169 Origin string ` json:"origin"`
8270 }{}
71+ err = json.NewDecoder (resp.Body ).Decode (&ipResponse)
8372
84- if err := json.NewDecoder (resp.Body ).Decode (ipResponse); err != nil {
85- return " " , err
86- }
87-
88- return ipResponse.Origin , nil
73+ return ipResponse.Origin , err
8974}
9075```
9176
92- ## Concurrency Correctness
93-
94- When utilizing plain Go channels for concurrency, reasoning over the correctness of concurrent code becomes simpler
95- compared to some other implementations of futures and promises.
96- Channels provide a clear and explicit means of communication and synchronization between concurrent goroutines, making
97- it easier to understand and reason about the flow of data and control in a concurrent program.
98-
99- Therefore, this library provides a straightforward and idiomatic approach to achieving concurrency correctness.
100-
10177## Links
10278
10379- [ Futures and Promises] ( https://en.wikipedia.org/wiki/Futures_and_promises ) in the English Wikipedia
0 commit comments