@@ -73,9 +73,33 @@ function reject(\Throwable $reason): PromiseInterface
7373 */
7474function all (array $ promisesOrValues ): PromiseInterface
7575{
76- return map ($ promisesOrValues , function ($ val ) {
77- return $ val ;
78- });
76+ if (!$ promisesOrValues ) {
77+ return resolve ([]);
78+ }
79+
80+ $ cancellationQueue = new Internal \CancellationQueue ();
81+
82+ return new Promise (function ($ resolve , $ reject ) use ($ promisesOrValues , $ cancellationQueue ): void {
83+ $ toResolve = \count ($ promisesOrValues );
84+ $ values = [];
85+
86+ foreach ($ promisesOrValues as $ i => $ promiseOrValue ) {
87+ $ cancellationQueue ->enqueue ($ promiseOrValue );
88+ $ values [$ i ] = null ;
89+
90+ resolve ($ promiseOrValue )
91+ ->done (
92+ function ($ mapped ) use ($ i , &$ values , &$ toResolve , $ resolve ): void {
93+ $ values [$ i ] = $ mapped ;
94+
95+ if (0 === --$ toResolve ) {
96+ $ resolve ($ values );
97+ }
98+ },
99+ $ reject
100+ );
101+ }
102+ }, $ cancellationQueue );
79103}
80104
81105/**
@@ -168,49 +192,6 @@ function any(array $promisesOrValues): PromiseInterface
168192 }, $ cancellationQueue );
169193}
170194
171- /**
172- * Traditional map function, similar to `array_map()`, but allows input to contain
173- * promises and/or values, and `$mapFunc` may return either a value or a promise.
174- *
175- * The map function receives each item as argument, where item is a fully resolved
176- * value of a promise or value in `$promisesOrValues`.
177- *
178- * @param array $promisesOrValues
179- * @param callable $mapFunc
180- * @return PromiseInterface
181- */
182- function map (array $ promisesOrValues , callable $ mapFunc ): PromiseInterface
183- {
184- if (!$ promisesOrValues ) {
185- return resolve ([]);
186- }
187-
188- $ cancellationQueue = new Internal \CancellationQueue ();
189-
190- return new Promise (function ($ resolve , $ reject ) use ($ promisesOrValues , $ mapFunc , $ cancellationQueue ): void {
191- $ toResolve = \count ($ promisesOrValues );
192- $ values = [];
193-
194- foreach ($ promisesOrValues as $ i => $ promiseOrValue ) {
195- $ cancellationQueue ->enqueue ($ promiseOrValue );
196- $ values [$ i ] = null ;
197-
198- resolve ($ promiseOrValue )
199- ->then ($ mapFunc )
200- ->done (
201- function ($ mapped ) use ($ i , &$ values , &$ toResolve , $ resolve ): void {
202- $ values [$ i ] = $ mapped ;
203-
204- if (0 === --$ toResolve ) {
205- $ resolve ($ values );
206- }
207- },
208- $ reject
209- );
210- }
211- }, $ cancellationQueue );
212- }
213-
214195/**
215196 * @internal
216197 */
0 commit comments