|
1 | 1 | import { Observable } from "rxjs" |
2 | 2 | import { SUSPENSE } from "../SUSPENSE" |
3 | | -import { BehaviorObservable, Action } from "./BehaviorObservable" |
| 3 | +import { BehaviorObservable } from "./BehaviorObservable" |
4 | 4 | import { EMPTY_VALUE } from "./empty-value" |
5 | 5 |
|
6 | 6 | const reactEnhancer = <T>(source$: Observable<T>): BehaviorObservable<T> => { |
7 | | - const result = new Observable<T>((subscriber) => { |
8 | | - let latestValue = EMPTY_VALUE |
9 | | - return source$.subscribe( |
10 | | - (value) => { |
11 | | - if (!Object.is(latestValue, value)) { |
12 | | - subscriber.next((latestValue = value)) |
13 | | - } |
14 | | - }, |
15 | | - (e) => { |
16 | | - subscriber.error(e) |
17 | | - }, |
18 | | - ) |
19 | | - }) as BehaviorObservable<T> |
| 7 | + const result = new Observable<T>((subscriber) => |
| 8 | + source$.subscribe(subscriber), |
| 9 | + ) as BehaviorObservable<T> |
20 | 10 |
|
21 | | - let promise: undefined | { type: Action.Suspense; payload: Promise<T | void> } |
22 | | - let error: |
23 | | - | typeof EMPTY_VALUE |
24 | | - | { type: Action.Error; payload: any } = EMPTY_VALUE |
25 | | - const getValue = (): { type: Action; payload: any } => { |
| 11 | + let promise: Promise<T | void> | undefined |
| 12 | + let error: any = EMPTY_VALUE |
| 13 | + const getValue = (): T => { |
26 | 14 | let timeoutToken |
27 | 15 | if (error !== EMPTY_VALUE) { |
28 | 16 | clearTimeout(timeoutToken) |
29 | 17 | timeoutToken = setTimeout(() => { |
30 | 18 | error = EMPTY_VALUE |
31 | 19 | }, 50) |
32 | | - return error |
| 20 | + throw error |
33 | 21 | } |
34 | 22 |
|
35 | 23 | try { |
36 | | - return { |
37 | | - type: Action.Value, |
38 | | - payload: (source$ as BehaviorObservable<T>).getValue(), |
39 | | - } |
| 24 | + return (source$ as BehaviorObservable<T>).getValue() |
40 | 25 | } catch (e) { |
41 | | - if (promise) return promise |
42 | | - |
43 | | - let value: |
44 | | - | typeof EMPTY_VALUE |
45 | | - | { type: Action.Value; payload: T } = EMPTY_VALUE |
46 | | - |
47 | | - promise = { |
48 | | - type: Action.Suspense, |
49 | | - payload: new Promise<T>((res) => { |
50 | | - const subscription = result.subscribe( |
51 | | - (v) => { |
52 | | - if (v !== (SUSPENSE as any)) { |
53 | | - value = { type: Action.Value, payload: v } |
54 | | - subscription && subscription.unsubscribe() |
55 | | - res(v) |
56 | | - } |
57 | | - }, |
58 | | - (e) => { |
59 | | - error = { type: Action.Error, payload: e } |
60 | | - timeoutToken = setTimeout(() => { |
61 | | - error = EMPTY_VALUE |
62 | | - }, 50) |
63 | | - res() |
64 | | - }, |
65 | | - ) |
66 | | - if (value !== EMPTY_VALUE) { |
67 | | - subscription.unsubscribe() |
68 | | - } |
69 | | - }).finally(() => { |
70 | | - promise = undefined |
71 | | - }), |
72 | | - } |
| 26 | + if (promise) throw promise |
| 27 | + |
| 28 | + let value: typeof EMPTY_VALUE | T = EMPTY_VALUE |
| 29 | + |
| 30 | + promise = new Promise<T>((res) => { |
| 31 | + const subscription = result.subscribe( |
| 32 | + (v) => { |
| 33 | + if (v !== (SUSPENSE as any)) { |
| 34 | + value = v |
| 35 | + subscription && subscription.unsubscribe() |
| 36 | + res(v) |
| 37 | + } |
| 38 | + }, |
| 39 | + (e) => { |
| 40 | + error = e |
| 41 | + timeoutToken = setTimeout(() => { |
| 42 | + error = EMPTY_VALUE |
| 43 | + }, 50) |
| 44 | + res() |
| 45 | + }, |
| 46 | + ) |
| 47 | + if (value !== EMPTY_VALUE) { |
| 48 | + subscription.unsubscribe() |
| 49 | + } |
| 50 | + }).finally(() => { |
| 51 | + promise = undefined |
| 52 | + }) |
73 | 53 |
|
74 | | - if (value !== EMPTY_VALUE) { |
75 | | - return value |
76 | | - } |
| 54 | + if (value !== EMPTY_VALUE) return value |
77 | 55 |
|
78 | | - return error !== EMPTY_VALUE ? error : promise |
| 56 | + throw error !== EMPTY_VALUE ? error : promise |
79 | 57 | } |
80 | 58 | } |
81 | 59 | result.getValue = getValue |
|
0 commit comments