Skip to content

Commit 05ebf63

Browse files
committed
fix and refactor defaultUse
1 parent 53d799d commit 05ebf63

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/vanilla.ts

+26-13
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type CreateSnapshot = <T extends object>(
3535
target: T,
3636
receiver: object,
3737
version: number,
38-
use?: (promise: Promise<unknown>) => void
38+
use?: <V>(promise: Promise<V>) => V
3939
) => T
4040

4141
type ProxyState<T extends object> = [
@@ -69,14 +69,30 @@ const buildProxyFunction = (
6969
!(x instanceof RegExp) &&
7070
!(x instanceof ArrayBuffer),
7171

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
7794
}
78-
throw (promise as any)[PROMISE_ERROR] || promise
79-
},
95+
})(),
8096

8197
snapCache = new WeakMap<object, [version: number, snap: unknown]>(),
8298

@@ -205,13 +221,12 @@ const buildProxyFunction = (
205221
} else if (value instanceof Promise) {
206222
nextValue = value
207223
.then((v) => {
208-
nextValue[PROMISE_RESULT] = v
209224
notifyUpdate(['resolve', [prop], v])
210225
return v
211226
})
212227
.catch((e) => {
213-
nextValue[PROMISE_ERROR] = e
214228
notifyUpdate(['reject', [prop], e])
229+
throw e
215230
})
216231
} else if (value?.[PROXY_STATE]) {
217232
nextValue = value
@@ -257,8 +272,6 @@ const buildProxyFunction = (
257272
objectIs,
258273
newProxy,
259274
canProxy,
260-
PROMISE_RESULT,
261-
PROMISE_ERROR,
262275
defaultUse,
263276
snapCache,
264277
createSnapshot,
@@ -309,7 +322,7 @@ export function subscribe<T extends object>(
309322

310323
export function snapshot<T extends object>(
311324
proxyObject: T,
312-
use?: (promise: Promise<unknown>) => void
325+
use?: <V>(promise: Promise<V>) => V
313326
): INTERNAL_Snapshot<T> {
314327
if (__DEV__ && !(proxyObject as any)?.[PROXY_STATE]) {
315328
console.warn('Please use proxy object')

0 commit comments

Comments
 (0)