Skip to content

Commit b6934a5

Browse files
committed
ref(utils): Extract SyncPromise static methods into func
1 parent 4de380d commit b6934a5

File tree

1 file changed

+48
-8
lines changed

1 file changed

+48
-8
lines changed

packages/utils/src/syncpromise.ts

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const enum States {
1818
* Thenable class that behaves like a Promise and follows it's interface
1919
* but is not async internally
2020
*/
21-
class SyncPromise<T> implements PromiseLike<T> {
21+
export class SyncPromise<T> implements PromiseLike<T> {
2222
private _state: States = States.PENDING;
2323
private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]> = [];
2424
private _value: any;
@@ -35,16 +35,12 @@ class SyncPromise<T> implements PromiseLike<T> {
3535

3636
/** JSDoc */
3737
public static resolve<T>(value: T | PromiseLike<T>): PromiseLike<T> {
38-
return new SyncPromise(resolve => {
39-
resolve(value);
40-
});
38+
return syncPromiseResolve(value);
4139
}
4240

4341
/** JSDoc */
4442
public static reject<T = never>(reason?: any): PromiseLike<T> {
45-
return new SyncPromise((_, reject) => {
46-
reject(reason);
47-
});
43+
return syncPromiseReject(reason);
4844
}
4945

5046
/** JSDoc */
@@ -178,4 +174,48 @@ class SyncPromise<T> implements PromiseLike<T> {
178174
};
179175
}
180176

181-
export { SyncPromise };
177+
/** JSDoc */
178+
export function syncPromiseResolve<T>(value: T | PromiseLike<T>): PromiseLike<T> {
179+
return new SyncPromise(resolve => {
180+
resolve(value);
181+
});
182+
}
183+
184+
/** JSDoc */
185+
export function syncPromiseReject<T = never>(reason?: any): PromiseLike<T> {
186+
return new SyncPromise((_, reject) => {
187+
reject(reason);
188+
});
189+
}
190+
191+
/** JSDoc */
192+
export function syncPromiseAll<U = any>(collection: Array<U | PromiseLike<U>>): PromiseLike<U[]> {
193+
return new SyncPromise<U[]>((resolve, reject) => {
194+
if (!Array.isArray(collection)) {
195+
reject(new TypeError(`Promise.all requires an array as input.`));
196+
return;
197+
}
198+
199+
if (collection.length === 0) {
200+
resolve([]);
201+
return;
202+
}
203+
204+
let counter = collection.length;
205+
const resolvedCollection: U[] = [];
206+
207+
collection.forEach((item, index) => {
208+
void syncPromiseResolve(item)
209+
.then(value => {
210+
resolvedCollection[index] = value;
211+
counter -= 1;
212+
213+
if (counter !== 0) {
214+
return;
215+
}
216+
resolve(resolvedCollection);
217+
})
218+
.then(null, reject);
219+
});
220+
});
221+
}

0 commit comments

Comments
 (0)