File tree Expand file tree Collapse file tree 1 file changed +15
-6
lines changed Expand file tree Collapse file tree 1 file changed +15
-6
lines changed Original file line number Diff line number Diff 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 )
You can’t perform that action at this time.
0 commit comments