Skip to content

Commit b1624c6

Browse files
fix(justjs.$q): Fix $q.all([..]) and $q.all({...})
1 parent 98b5b42 commit b1624c6

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/justjs.ts

+15-13
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
export * from "./core";
77
import {services} from "./common/coreservices";
88
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";
1010

1111
/** $q-like promise api */
1212
services.$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

Comments
 (0)