Skip to content

Commit 1fe4a0f

Browse files
authored
feat(syncpromise): trim down SyncPromise (#4319)
1 parent caba96e commit 1fe4a0f

File tree

2 files changed

+52
-97
lines changed

2 files changed

+52
-97
lines changed

packages/utils/src/promisebuffer.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
import { SentryError } from './error';
22
import { SyncPromise } from './syncpromise';
33

4+
function allPromises<U = unknown>(collection: Array<U | PromiseLike<U>>): PromiseLike<U[]> {
5+
return new SyncPromise<U[]>((resolve, reject) => {
6+
if (collection.length === 0) {
7+
resolve(null);
8+
return;
9+
}
10+
11+
let counter = collection.length;
12+
collection.forEach(item => {
13+
void SyncPromise.resolve(item)
14+
.then(() => {
15+
// eslint-disable-next-line no-plusplus
16+
if (--counter === 0) {
17+
resolve(null);
18+
}
19+
})
20+
.then(null, reject);
21+
});
22+
});
23+
}
24+
425
/** A simple queue that holds promises. */
526
export class PromiseBuffer<T> {
627
/** Internal set of queued Promises */
@@ -85,14 +106,10 @@ export class PromiseBuffer<T> {
85106
}, timeout);
86107

87108
// if all promises resolve in time, cancel the timer and resolve to `true`
88-
void SyncPromise.all(this._buffer)
89-
.then(() => {
90-
clearTimeout(capturedSetTimeout);
91-
resolve(true);
92-
})
93-
.then(null, () => {
94-
resolve(true);
95-
});
109+
void allPromises(this._buffer).then(() => {
110+
clearTimeout(capturedSetTimeout);
111+
resolve(true);
112+
});
96113
});
97114
}
98115
}

packages/utils/src/syncpromise.ts

Lines changed: 27 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { isThenable } from './is';
77
/** SyncPromise internal states */
88
const enum States {
99
/** Pending */
10-
PENDING = 'PENDING',
10+
PENDING = 0,
1111
/** Resolved / OK */
12-
RESOLVED = 'RESOLVED',
12+
RESOLVED = 1,
1313
/** Rejected / Error */
14-
REJECTED = 'REJECTED',
14+
REJECTED = 2,
1515
}
1616

1717
/**
@@ -20,11 +20,7 @@ const enum States {
2020
*/
2121
class SyncPromise<T> implements PromiseLike<T> {
2222
private _state: States = States.PENDING;
23-
private _handlers: Array<{
24-
done: boolean;
25-
onfulfilled?: ((value: T) => T | PromiseLike<T>) | null;
26-
onrejected?: ((reason: any) => any) | null;
27-
}> = [];
23+
private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]> = [];
2824
private _value: any;
2925

3026
public constructor(
@@ -51,75 +47,40 @@ class SyncPromise<T> implements PromiseLike<T> {
5147
});
5248
}
5349

54-
/** JSDoc */
55-
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-
});
84-
}
85-
8650
/** JSDoc */
8751
public then<TResult1 = T, TResult2 = never>(
8852
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
8953
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,
9054
): PromiseLike<TResult1 | TResult2> {
9155
return new SyncPromise((resolve, reject) => {
92-
this._attachHandler({
93-
done: false,
94-
onfulfilled: result => {
56+
this._handlers.push([
57+
false,
58+
result => {
9559
if (!onfulfilled) {
9660
// TODO: ¯\_(ツ)_/¯
9761
// TODO: FIXME
9862
resolve(result as any);
99-
return;
100-
}
101-
try {
102-
resolve(onfulfilled(result));
103-
return;
104-
} catch (e) {
105-
reject(e);
106-
return;
63+
} else {
64+
try {
65+
resolve(onfulfilled(result));
66+
} catch (e) {
67+
reject(e);
68+
}
10769
}
10870
},
109-
onrejected: reason => {
71+
reason => {
11072
if (!onrejected) {
11173
reject(reason);
112-
return;
113-
}
114-
try {
115-
resolve(onrejected(reason));
116-
return;
117-
} catch (e) {
118-
reject(e);
119-
return;
74+
} else {
75+
try {
76+
resolve(onrejected(reason));
77+
} catch (e) {
78+
reject(e);
79+
}
12080
}
12181
},
122-
});
82+
]);
83+
this._executeHandlers();
12384
});
12485
}
12586

@@ -162,11 +123,6 @@ class SyncPromise<T> implements PromiseLike<T> {
162123
});
163124
}
164125

165-
/** JSDoc */
166-
public toString(): string {
167-
return '[object SyncPromise]';
168-
}
169-
170126
/** JSDoc */
171127
private readonly _resolve = (value?: T | PromiseLike<T> | null) => {
172128
this._setResult(States.RESOLVED, value);
@@ -194,20 +150,6 @@ class SyncPromise<T> implements PromiseLike<T> {
194150
this._executeHandlers();
195151
};
196152

197-
// TODO: FIXME
198-
/** JSDoc */
199-
private readonly _attachHandler = (handler: {
200-
/** JSDoc */
201-
done: boolean;
202-
/** JSDoc */
203-
onfulfilled?(value: T): any;
204-
/** JSDoc */
205-
onrejected?(reason: any): any;
206-
}) => {
207-
this._handlers = this._handlers.concat(handler);
208-
this._executeHandlers();
209-
};
210-
211153
/** JSDoc */
212154
private readonly _executeHandlers = () => {
213155
if (this._state === States.PENDING) {
@@ -218,24 +160,20 @@ class SyncPromise<T> implements PromiseLike<T> {
218160
this._handlers = [];
219161

220162
cachedHandlers.forEach(handler => {
221-
if (handler.done) {
163+
if (handler[0]) {
222164
return;
223165
}
224166

225167
if (this._state === States.RESOLVED) {
226-
if (handler.onfulfilled) {
227-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
228-
handler.onfulfilled((this._value as unknown) as any);
229-
}
168+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
169+
handler[1]((this._value as unknown) as any);
230170
}
231171

232172
if (this._state === States.REJECTED) {
233-
if (handler.onrejected) {
234-
handler.onrejected(this._value);
235-
}
173+
handler[2](this._value);
236174
}
237175

238-
handler.done = true;
176+
handler[0] = true;
239177
});
240178
};
241179
}

0 commit comments

Comments
 (0)