1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-23 13:52:26 +08:00

Compare commits

...

2 Commits

Author SHA1 Message Date
dudaodong
4ae7e59829 feat: add example for promise 2023-03-17 16:03:35 +08:00
dudaodong
8f0c60cade test: add unit test for promise Race and Any function 2023-03-17 13:59:18 +08:00
3 changed files with 315 additions and 3 deletions

View File

@@ -237,7 +237,7 @@ func Race[T any](promises []*Promise[T]) *Promise[T] {
// Any resolves as soon as any of the input's Promises resolve, with the value of the resolved Promise.
// Any rejects if all of the given Promises are rejected with a combination of all errors.
func Any[T any](promises ...*Promise[T]) *Promise[T] {
func Any[T any](promises []*Promise[T]) *Promise[T] {
if len(promises) == 0 {
return nil
}

View File

@@ -0,0 +1,195 @@
package async
import (
"errors"
"fmt"
"time"
"github.com/duke-git/lancet/v2/internal"
)
func ExampleNew() {
p := New(func(resolve func(string), reject func(error)) {
resolve("hello")
})
val, err := p.Await()
if err != nil {
return
}
fmt.Println(val)
// Output:
// hello
}
func ExampleThen() {
p1 := New(func(resolve func(string), reject func(error)) {
resolve("hello ")
})
p2 := Then(p1, func(s string) string {
return s + "world"
})
result, err := p2.Await()
if err != nil {
return
}
fmt.Println(result)
// Output:
// hello world
}
func ExamplePromise_Then() {
p1 := New(func(resolve func(string), reject func(error)) {
resolve("hello ")
})
p2 := p1.Then(func(s string) string {
return s + "world"
})
result, err := p2.Await()
if err != nil {
return
}
fmt.Println(result)
// Output:
// hello world
}
func ExampleCatch() {
p1 := New(func(resolve func(string), reject func(error)) {
err := errors.New("error1")
reject(err)
})
p2 := Catch(p1, func(err error) error {
e := errors.New("error2")
return internal.JoinError(err, e)
})
_, err := p1.Await()
fmt.Println(err.Error())
result2, err := p2.Await()
fmt.Println(result2)
fmt.Println(err.Error())
// Output:
// error1
//
// error1
// error2
}
func ExamplePromise_Catch() {
p1 := New(func(resolve func(string), reject func(error)) {
err := errors.New("error1")
reject(err)
})
p2 := p1.Catch(func(err error) error {
e := errors.New("error2")
return internal.JoinError(err, e)
})
_, err := p1.Await()
fmt.Println(err.Error())
result2, err := p2.Await()
fmt.Println(result2)
fmt.Println(err.Error())
// Output:
// error1
//
// error1
// error2
}
func ExampleAll() {
p1 := New(func(resolve func(string), reject func(error)) {
resolve("a")
})
p2 := New(func(resolve func(string), reject func(error)) {
resolve("b")
})
p3 := New(func(resolve func(string), reject func(error)) {
resolve("c")
})
pms := []*Promise[string]{p1, p2, p3}
p := All(pms)
result, err := p.Await()
if err != nil {
return
}
fmt.Println(result)
// Output:
// [a b c]
}
func ExampleAny() {
p1 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 250)
resolve("fast")
})
p2 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 500)
resolve("slow")
})
p3 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error"))
})
pms := []*Promise[string]{p1, p2, p3}
p := Any(pms)
result, err := p.Await()
if err != nil {
return
}
fmt.Println(result)
// Output:
// fast
}
func ExampleRace() {
p1 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 100)
resolve("fast")
})
p2 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 300)
resolve("slow")
})
pms := []*Promise[string]{p1, p2}
p := Race(pms)
result, err := p.Await()
if err != nil {
return
}
fmt.Println(result)
// Output:
// fast
}

View File

@@ -3,6 +3,7 @@ package async
import (
"errors"
"testing"
"time"
"github.com/duke-git/lancet/v2/internal"
)
@@ -117,7 +118,7 @@ func TestPromise_Catch(t *testing.T) {
}
func TestAll(t *testing.T) {
assert := internal.NewAssert(t, "TestPromise_Catch")
assert := internal.NewAssert(t, "TestPromise_All")
t.Run("AllPromisesFullfilled", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
@@ -159,7 +160,7 @@ func TestAll(t *testing.T) {
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
assert.Equal("error1", err.Error())
})
t.Run("PromisesOnlyRejected", func(_ *testing.T) {
@@ -183,3 +184,119 @@ func TestAll(t *testing.T) {
})
}
func TestAny(t *testing.T) {
assert := internal.NewAssert(t, "TestPromise_Any")
t.Run("AnyFullfilled", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 250)
resolve("fast")
})
p2 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 500)
resolve("slow")
})
p3 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error"))
})
p := Any([]*Promise[string]{p1, p2, p3})
val, err := p.Await()
assert.Equal("fast", val)
assert.IsNil(err)
})
t.Run("EmptyPromises", func(_ *testing.T) {
var empty = []*Promise[any]{}
p := Any(empty)
assert.IsNil(p)
})
t.Run("OnlyRejected", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error1"))
})
p2 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error2"))
})
p := Any([]*Promise[string]{p1, p2})
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
})
}
func TestRace(t *testing.T) {
assert := internal.NewAssert(t, "TestPromise_Race")
t.Run("PromisesFullfilled", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 100)
resolve("a")
})
p2 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 300)
resolve("b")
})
p := Race([]*Promise[string]{p1, p2})
val, err := p.Await()
assert.Equal("a", val)
assert.IsNil(err)
})
t.Run("EmptyPromises", func(_ *testing.T) {
var empty = []*Promise[any]{}
p := Race(empty)
assert.IsNil(p)
})
t.Run("PromisesContainRejected", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
time.Sleep(time.Millisecond * 100)
resolve("a")
})
p2 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error1"))
})
p3 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error2"))
})
p := Race([]*Promise[string]{p1, p2, p3})
val, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
assert.Equal("", val)
})
t.Run("PromisesOnlyRejected", func(_ *testing.T) {
p1 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error1"))
})
p2 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error2"))
})
p3 := New(func(resolve func(string), reject func(error)) {
reject(errors.New("error3"))
})
p := Race([]*Promise[string]{p1, p2, p3})
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
})
}