@@ -7,11 +7,11 @@ import { isThenable } from './is';
7
7
/** SyncPromise internal states */
8
8
const enum States {
9
9
/** Pending */
10
- PENDING = 'PENDING' ,
10
+ PENDING = 0 ,
11
11
/** Resolved / OK */
12
- RESOLVED = 'RESOLVED' ,
12
+ RESOLVED = 1 ,
13
13
/** Rejected / Error */
14
- REJECTED = 'REJECTED' ,
14
+ REJECTED = 2 ,
15
15
}
16
16
17
17
/**
@@ -20,11 +20,7 @@ const enum States {
20
20
*/
21
21
class SyncPromise < T > implements PromiseLike < T > {
22
22
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 ] > = [ ] ;
28
24
private _value : any ;
29
25
30
26
public constructor (
@@ -51,75 +47,40 @@ class SyncPromise<T> implements PromiseLike<T> {
51
47
} ) ;
52
48
}
53
49
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
-
86
50
/** JSDoc */
87
51
public then < TResult1 = T , TResult2 = never > (
88
52
onfulfilled ?: ( ( value : T ) => TResult1 | PromiseLike < TResult1 > ) | null ,
89
53
onrejected ?: ( ( reason : any ) => TResult2 | PromiseLike < TResult2 > ) | null ,
90
54
) : PromiseLike < TResult1 | TResult2 > {
91
55
return new SyncPromise ( ( resolve , reject ) => {
92
- this . _attachHandler ( {
93
- done : false ,
94
- onfulfilled : result => {
56
+ this . _handlers . push ( [
57
+ false ,
58
+ result => {
95
59
if ( ! onfulfilled ) {
96
60
// TODO: ¯\_(ツ)_/¯
97
61
// TODO: FIXME
98
62
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
+ }
107
69
}
108
70
} ,
109
- onrejected : reason => {
71
+ reason => {
110
72
if ( ! onrejected ) {
111
73
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
+ }
120
80
}
121
81
} ,
122
- } ) ;
82
+ ] ) ;
83
+ this . _executeHandlers ( ) ;
123
84
} ) ;
124
85
}
125
86
@@ -162,11 +123,6 @@ class SyncPromise<T> implements PromiseLike<T> {
162
123
} ) ;
163
124
}
164
125
165
- /** JSDoc */
166
- public toString ( ) : string {
167
- return '[object SyncPromise]' ;
168
- }
169
-
170
126
/** JSDoc */
171
127
private readonly _resolve = ( value ?: T | PromiseLike < T > | null ) => {
172
128
this . _setResult ( States . RESOLVED , value ) ;
@@ -194,20 +150,6 @@ class SyncPromise<T> implements PromiseLike<T> {
194
150
this . _executeHandlers ( ) ;
195
151
} ;
196
152
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
-
211
153
/** JSDoc */
212
154
private readonly _executeHandlers = ( ) => {
213
155
if ( this . _state === States . PENDING ) {
@@ -218,24 +160,20 @@ class SyncPromise<T> implements PromiseLike<T> {
218
160
this . _handlers = [ ] ;
219
161
220
162
cachedHandlers . forEach ( handler => {
221
- if ( handler . done ) {
163
+ if ( handler [ 0 ] ) {
222
164
return ;
223
165
}
224
166
225
167
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 ) ;
230
170
}
231
171
232
172
if ( this . _state === States . REJECTED ) {
233
- if ( handler . onrejected ) {
234
- handler . onrejected ( this . _value ) ;
235
- }
173
+ handler [ 2 ] ( this . _value ) ;
236
174
}
237
175
238
- handler . done = true ;
176
+ handler [ 0 ] = true ;
239
177
} ) ;
240
178
} ;
241
179
}
0 commit comments