6
6
export * from "./core" ;
7
7
import { services } from "./common/coreservices" ;
8
8
import { isDefined , isFunction , isArray , isObject , isInjectable } from "./common/predicates" ;
9
- import { extend , assertPredicate , forEach } from "./common/common" ;
9
+ import { extend , assertPredicate , forEach , applyPairs } from "./common/common" ;
10
10
11
11
/** $q-like promise api */
12
12
services . $q = ( executor : ( resolve , reject ) => void ) => new Promise ( executor ) ;
@@ -26,22 +26,24 @@ services.$q.all = function (promises: { [key: string]: Promise<any> } | Promise<
26
26
if ( isArray ( promises ) ) {
27
27
return new Promise ( ( resolve , reject ) => {
28
28
let results = [ ] ;
29
- promises . reduce ( ( memo , promise ) => {
30
- if ( ! isDefined ( memo ) ) return promise ;
31
- return memo . then ( val => results . push ( val ) ) . then ( ( ) => promise ) ;
32
- } ) . then ( ( ) => resolve ( results ) , reject ) ;
29
+ promises . reduce ( ( wait4 , promise ) => wait4 . then ( ( ) => promise . then ( val => results . push ( val ) ) ) , services . $q . when ( ) )
30
+ . then ( ( ) => { resolve ( results ) ; } , reject ) ;
33
31
} ) ;
34
32
}
35
33
36
34
if ( isObject ( promises ) ) {
37
- let results = { } ;
38
- return new Promise ( ( resolve , reject ) => {
39
- let chain = services . $q . when ( ) ;
40
- forEach ( promises , ( promise : Promise < any > , key : string ) => {
41
- promise . then ( val => results [ key ] = val ) ;
42
- chain = chain . then ( ( ) => promise ) ;
43
- } ) ;
44
- chain . then ( resolve , reject ) ;
35
+ // console.log("$q.all({}) Input:", promises);
36
+
37
+ // Convert promises map to promises array.
38
+ // When each promise resolves, map it to a tuple { key: key, val: val }
39
+ let chain = Object . keys ( promises )
40
+ . map ( key => promises [ key ] . then ( val => ( { key, val} ) ) ) ;
41
+ // Then wait for all promises to resolve, and convert them back to an object
42
+ return services . $q . all ( chain ) . then ( values => {
43
+ let value = values . reduce ( ( acc , tuple ) => { acc [ tuple . key ] = tuple . val ; return acc ; } , { } ) ;
44
+
45
+ // console.log("$q.all({}) Output:", value);
46
+ return value ;
45
47
} ) ;
46
48
}
47
49
} ;
0 commit comments