Skip to content

Commit 138c0f4

Browse files
committed
fix: Any race error
1 parent daf14f1 commit 138c0f4

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

promise_static.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,23 +131,32 @@ func Any[T any](promises ...*Promise[T]) *Promise[T] {
131131
}
132132

133133
errs := make([]error, len(promises))
134-
completed := 0
134+
var completed int32
135+
var hasSuccess int32
136+
var mu sync.Mutex
135137

136138
for i, p := range promises {
137139
go func(index int, promise *Promise[T]) {
138140
value, err := promise.Await()
139141

140142
if err == nil {
141-
// Success, resolve immediately
142-
resolve(value)
143+
// Success, resolve immediately if not already resolved
144+
if atomic.CompareAndSwapInt32(&hasSuccess, 0, 1) {
145+
resolve(value)
146+
}
143147
return
144148
}
145149

150+
// Use mutex to protect errs array access
151+
mu.Lock()
146152
errs[index] = err
147-
completed++
153+
mu.Unlock()
154+
155+
// Increment completed counter atomically
156+
newCompleted := atomic.AddInt32(&completed, 1)
148157

149-
// If all Promises failed
150-
if completed == len(promises) {
158+
// If all Promises failed and no success yet
159+
if newCompleted == int32(len(promises)) && atomic.LoadInt32(&hasSuccess) == 0 {
151160
reject(errors.New("all promises rejected"))
152161
}
153162
}(i, p)

0 commit comments

Comments
 (0)