diff --git a/packages/core/src/bind/connectFactoryObservable.ts b/packages/core/src/bind/connectFactoryObservable.ts index d5c03fb..e6e5bad 100644 --- a/packages/core/src/bind/connectFactoryObservable.ts +++ b/packages/core/src/bind/connectFactoryObservable.ts @@ -1,4 +1,4 @@ -import { Observable, defer } from "rxjs" +import { Observable } from "rxjs" import shareLatest from "../internal/share-latest" import reactEnhancer from "../internal/react-enhancer" import { BehaviorObservable } from "../internal/BehaviorObservable" @@ -30,11 +30,14 @@ export default function connectFactoryObservable( (...args: A) => Exclude, (...args: A) => Observable, ] { - const cache = new NestedMap, BehaviorObservable]>() + const cache = new NestedMap< + A, + [BehaviorObservable, BehaviorObservable] + >() const getSharedObservables$ = ( input: A, - ): [Observable, BehaviorObservable] => { + ): [BehaviorObservable, BehaviorObservable] => { for (let i = input.length - 1; input[i] === undefined && i > -1; i--) { input.splice(-1) } @@ -53,17 +56,21 @@ export default function connectFactoryObservable( }, ) - const reactObservable$ = reactEnhancer(sharedObservable$) - - const publicShared$: Observable = defer(() => { + const publicShared$ = new Observable((subscriber) => { const inCache = cache.get(keys) - if (inCache) { - return inCache[0] === publicShared$ ? sharedObservable$ : inCache[0] - } - return getSharedObservables$(input)[0] - }) + const source$ = inCache + ? inCache[0] === publicShared$ + ? sharedObservable$ + : inCache[0] + : getSharedObservables$(input)[0] - const result: [Observable, BehaviorObservable] = [ + publicShared$.getValue = source$.getValue + + return source$.subscribe(subscriber) + }) as BehaviorObservable + const reactObservable$ = reactEnhancer(publicShared$) + + const result: [BehaviorObservable, BehaviorObservable] = [ publicShared$, reactObservable$, ]