Skip to content

Commit ca239b1

Browse files
committed
ref(utils): Extract SyncPromise static methods into func
1 parent b8dc945 commit ca239b1

File tree

1 file changed

+49
-36
lines changed

1 file changed

+49
-36
lines changed

packages/utils/src/syncpromise.ts

Lines changed: 49 additions & 36 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<{
2424
done: boolean;
@@ -39,48 +39,17 @@ class SyncPromise<T> implements PromiseLike<T> {
3939

4040
/** JSDoc */
4141
public static resolve<T>(value: T | PromiseLike<T>): PromiseLike<T> {
42-
return new SyncPromise(resolve => {
43-
resolve(value);
44-
});
42+
return syncPromiseResolve(value);
4543
}
4644

4745
/** JSDoc */
4846
public static reject<T = never>(reason?: any): PromiseLike<T> {
49-
return new SyncPromise((_, reject) => {
50-
reject(reason);
51-
});
47+
return syncPromiseReject(reason);
5248
}
5349

5450
/** JSDoc */
5551
public static all<U = any>(collection: Array<U | PromiseLike<U>>): PromiseLike<U[]> {
56-
return new SyncPromise<U[]>((resolve, reject) => {
57-
if (!Array.isArray(collection)) {
58-
reject(new TypeError(`Promise.all requires an array as input.`));
59-
return;
60-
}
61-
62-
if (collection.length === 0) {
63-
resolve([]);
64-
return;
65-
}
66-
67-
let counter = collection.length;
68-
const resolvedCollection: U[] = [];
69-
70-
collection.forEach((item, index) => {
71-
void SyncPromise.resolve(item)
72-
.then(value => {
73-
resolvedCollection[index] = value;
74-
counter -= 1;
75-
76-
if (counter !== 0) {
77-
return;
78-
}
79-
resolve(resolvedCollection);
80-
})
81-
.then(null, reject);
82-
});
83-
});
52+
return syncPromiseAll(collection);
8453
}
8554

8655
/** JSDoc */
@@ -240,4 +209,48 @@ class SyncPromise<T> implements PromiseLike<T> {
240209
};
241210
}
242211

243-
export { SyncPromise };
212+
/** JSDoc */
213+
export function syncPromiseResolve<T>(value: T | PromiseLike<T>): PromiseLike<T> {
214+
return new SyncPromise(resolve => {
215+
resolve(value);
216+
});
217+
}
218+
219+
/** JSDoc */
220+
export function syncPromiseReject<T = never>(reason?: any): PromiseLike<T> {
221+
return new SyncPromise((_, reject) => {
222+
reject(reason);
223+
});
224+
}
225+
226+
/** JSDoc */
227+
export function syncPromiseAll<U = any>(collection: Array<U | PromiseLike<U>>): PromiseLike<U[]> {
228+
return new SyncPromise<U[]>((resolve, reject) => {
229+
if (!Array.isArray(collection)) {
230+
reject(new TypeError(`Promise.all requires an array as input.`));
231+
return;
232+
}
233+
234+
if (collection.length === 0) {
235+
resolve([]);
236+
return;
237+
}
238+
239+
let counter = collection.length;
240+
const resolvedCollection: U[] = [];
241+
242+
collection.forEach((item, index) => {
243+
void syncPromiseResolve(item)
244+
.then(value => {
245+
resolvedCollection[index] = value;
246+
counter -= 1;
247+
248+
if (counter !== 0) {
249+
return;
250+
}
251+
resolve(resolvedCollection);
252+
})
253+
.then(null, reject);
254+
});
255+
});
256+
}

0 commit comments

Comments
 (0)