@@ -35,7 +35,7 @@ type CreateSnapshot = <T extends object>(
35
35
target : T ,
36
36
receiver : object ,
37
37
version : number ,
38
- use ?: ( promise : Promise < unknown > ) => void
38
+ use ?: < V > ( promise : Promise < V > ) => V
39
39
) => T
40
40
41
41
type ProxyState < T extends object > = [
@@ -69,14 +69,30 @@ const buildProxyFunction = (
69
69
! ( x instanceof RegExp ) &&
70
70
! ( x instanceof ArrayBuffer ) ,
71
71
72
- PROMISE_RESULT = __DEV__ ? Symbol ( 'PROMISE_RESULT' ) : Symbol ( ) ,
73
- PROMISE_ERROR = __DEV__ ? Symbol ( 'PROMISE_ERROR' ) : Symbol ( ) ,
74
- defaultUse = ( promise : Promise < unknown > ) => {
75
- if ( PROMISE_RESULT in promise ) {
76
- return ( promise as any ) [ PROMISE_RESULT ]
72
+ defaultUse = ( ( ) => {
73
+ type PromiseState = { v ?: unknown ; e ?: unknown }
74
+ const PROMISE_STATE = Symbol ( )
75
+ return < V > ( promise : Promise < V > ) : V => {
76
+ let state : PromiseState | undefined = ( promise as any ) [ PROMISE_STATE ]
77
+ if ( ! state ) {
78
+ state = { }
79
+ ; ( promise as any ) [ PROMISE_STATE ] = state
80
+ promise
81
+ . then ( ( v ) => {
82
+ ; ( state as PromiseState ) . v = v
83
+ return v
84
+ } )
85
+ . catch ( ( e ) => {
86
+ ; ( state as PromiseState ) . e = e
87
+ throw e
88
+ } )
89
+ }
90
+ if ( 'v' in state ) {
91
+ return state . v as V
92
+ }
93
+ throw 'e' in state ? state . e : promise
77
94
}
78
- throw ( promise as any ) [ PROMISE_ERROR ] || promise
79
- } ,
95
+ } ) ( ) ,
80
96
81
97
snapCache = new WeakMap < object , [ version : number , snap : unknown ] > ( ) ,
82
98
@@ -205,13 +221,12 @@ const buildProxyFunction = (
205
221
} else if ( value instanceof Promise ) {
206
222
nextValue = value
207
223
. then ( ( v ) => {
208
- nextValue [ PROMISE_RESULT ] = v
209
224
notifyUpdate ( [ 'resolve' , [ prop ] , v ] )
210
225
return v
211
226
} )
212
227
. catch ( ( e ) => {
213
- nextValue [ PROMISE_ERROR ] = e
214
228
notifyUpdate ( [ 'reject' , [ prop ] , e ] )
229
+ throw e
215
230
} )
216
231
} else if ( value ?. [ PROXY_STATE ] ) {
217
232
nextValue = value
@@ -257,8 +272,6 @@ const buildProxyFunction = (
257
272
objectIs ,
258
273
newProxy ,
259
274
canProxy ,
260
- PROMISE_RESULT ,
261
- PROMISE_ERROR ,
262
275
defaultUse ,
263
276
snapCache ,
264
277
createSnapshot ,
@@ -309,7 +322,7 @@ export function subscribe<T extends object>(
309
322
310
323
export function snapshot < T extends object > (
311
324
proxyObject : T ,
312
- use ?: ( promise : Promise < unknown > ) => void
325
+ use ?: < V > ( promise : Promise < V > ) => V
313
326
) : INTERNAL_Snapshot < T > {
314
327
if ( __DEV__ && ! ( proxyObject as any ) ?. [ PROXY_STATE ] ) {
315
328
console . warn ( 'Please use proxy object' )
0 commit comments