package main
import (
"context"
"errors"
"fmt"
"github.com/vardius/gollback"
"time"
)
func main() {
rs, errs := gollback.All(
context.Background(),
func(ctx context.Context) (interface{}, error) {
time.Sleep(3 * time.Second)
return 1, nil
},
func(ctx context.Context) (interface{}, error) {
return nil, errors.New("failed")
},
func(ctx context.Context) (interface{}, error) {
return 3, nil
},
)
fmt.Println(rs)
fmt.Println(errs)
}
源码实现
func All(ctx context.Context, fns ...AsyncFunc) ([]interface{}, []error) {
if ctx == nil {
panic("nil context provided")
}
rs := make([]interface{}, len(fns))
errs := make([]error, len(fns))
var wg sync.WaitGroup
wg.Add(len(fns))
for i, fn := range fns {
go func(index int, f AsyncFunc) {
defer wg.Done()
var r response
r.res, r.err = f(ctx)
rs[index] = r.res
errs[index] = r.err
}(i, fn)
}
wg.Wait()
return rs, errs
}