1- import { Observable } from "rxjs"
21import { SUSPENSE } from "../SUSPENSE"
32import { BehaviorObservable } from "./BehaviorObservable"
43import { EMPTY_VALUE } from "./empty-value"
54
6- const reactEnhancer = < T > ( source$ : Observable < T > ) : BehaviorObservable < T > => {
7- const result = new Observable < T > ( ( subscriber ) =>
8- source$ . subscribe ( subscriber ) ,
9- ) as BehaviorObservable < T >
10-
5+ const reactEnhancer = < T > ( source$ : BehaviorObservable < T > ) : ( ( ) => T ) => {
116 let promise : Promise < T | void > | undefined
127 let error : any = EMPTY_VALUE
13- const getValue = ( ) : T => {
8+
9+ return ( ) : T => {
10+ const currentValue = source$ . getValue ( )
11+ if ( currentValue !== SUSPENSE && currentValue !== EMPTY_VALUE ) {
12+ return currentValue
13+ }
14+
1415 let timeoutToken
1516 if ( error !== EMPTY_VALUE ) {
1617 clearTimeout ( timeoutToken )
@@ -20,44 +21,38 @@ const reactEnhancer = <T>(source$: Observable<T>): BehaviorObservable<T> => {
2021 throw error
2122 }
2223
23- try {
24- return ( source$ as BehaviorObservable < T > ) . getValue ( )
25- } catch ( e ) {
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- } )
53-
54- if ( value !== EMPTY_VALUE ) return value
55-
56- throw error !== EMPTY_VALUE ? error : promise
57- }
24+ if ( promise ) throw promise
25+
26+ let value : typeof EMPTY_VALUE | T = EMPTY_VALUE
27+
28+ promise = new Promise < T > ( ( res ) => {
29+ const subscription = source$ . subscribe (
30+ ( v ) => {
31+ if ( v !== ( SUSPENSE as any ) ) {
32+ value = v
33+ subscription && subscription . unsubscribe ( )
34+ res ( v )
35+ }
36+ } ,
37+ ( e ) => {
38+ error = e
39+ timeoutToken = setTimeout ( ( ) => {
40+ error = EMPTY_VALUE
41+ } , 50 )
42+ res ( )
43+ } ,
44+ )
45+ if ( value !== EMPTY_VALUE ) {
46+ subscription . unsubscribe ( )
47+ }
48+ } ) . finally ( ( ) => {
49+ promise = undefined
50+ } )
51+
52+ if ( value !== EMPTY_VALUE ) return value
53+
54+ throw error !== EMPTY_VALUE ? error : promise
5855 }
59- result . getValue = getValue
60- return result
6156}
6257
6358export default reactEnhancer
0 commit comments