66export * from "./core" ;
77import { services } from "./common/coreservices" ;
88import { 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" ;
1010
1111/** $q-like promise api */
1212services . $q = ( executor : ( resolve , reject ) => void ) => new Promise ( executor ) ;
@@ -26,22 +26,24 @@ services.$q.all = function (promises: { [key: string]: Promise<any> } | Promise<
2626 if ( isArray ( promises ) ) {
2727 return new Promise ( ( resolve , reject ) => {
2828 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 ) ;
3331 } ) ;
3432 }
3533
3634 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 ;
4547 } ) ;
4648 }
4749} ;
0 commit comments