diff --git a/packages/core/src/internal/react-enhancer.ts b/packages/core/src/internal/react-enhancer.ts index 14b4a00..3712fee 100644 --- a/packages/core/src/internal/react-enhancer.ts +++ b/packages/core/src/internal/react-enhancer.ts @@ -58,7 +58,7 @@ const reactEnhancer = (source$: Observable): BehaviorObservable => { timeoutToken = setTimeout(() => { error = EMPTY_VALUE }, 50) - throw error + return error } try { @@ -70,7 +70,6 @@ const reactEnhancer = (source$: Observable): BehaviorObservable => { if (promise) return promise let value = EMPTY_VALUE - let isSyncError = false promise = { type: "s", payload: result @@ -82,7 +81,7 @@ const reactEnhancer = (source$: Observable): BehaviorObservable => { value = v }, error(e) { - error = e + error = { type: "e", payload: e } timeoutToken = setTimeout(() => { error = EMPTY_VALUE }, 50) @@ -90,10 +89,7 @@ const reactEnhancer = (source$: Observable): BehaviorObservable => { }), ) .toPromise() - .catch((e) => { - if (isSyncError) return - throw e - }) + .catch(() => {}) .finally(() => { promise = undefined valueResult = undefined @@ -105,8 +101,7 @@ const reactEnhancer = (source$: Observable): BehaviorObservable => { } if (error !== EMPTY_VALUE) { - isSyncError = true - throw error + return error } return promise diff --git a/packages/core/src/internal/useObservable.ts b/packages/core/src/internal/useObservable.ts index 0b7ba5a..0cbdeac 100644 --- a/packages/core/src/internal/useObservable.ts +++ b/packages/core/src/internal/useObservable.ts @@ -10,15 +10,10 @@ type Action = "e" | "v" | "s" const reducer = ( current: { type: Action; payload: any }, action: { type: Action; payload: any }, -) => { - if (action.type === ERROR) { - throw action.payload - } - return Object.is(current.payload, action.payload) && - current.type === action.type +) => + Object.is(current.payload, action.payload) && current.type === action.type ? current : action -} const init = (source$: BehaviorObservable) => source$.getValue() @@ -26,13 +21,10 @@ export const useObservable = ( source$: BehaviorObservable, ): Exclude => { const [state, dispatch] = useReducer(reducer, source$, init) + if (state.type === ERROR) throw state.payload useEffect(() => { - try { - dispatch(source$.getValue()) - } catch (e) { - return dispatch({ type: ERROR, payload: e }) - } + dispatch(source$.getValue()) const subscription = source$.subscribe( (value) => { if ((value as any) === SUSPENSE) {