Skip to content

Commit ffa503a

Browse files
committed
fix(core): defer the evaluation of the factory function
1 parent e6c7898 commit ffa503a

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

packages/core/src/bind/connectFactoryObservable.test.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,47 @@ describe("connectFactoryObservable", () => {
847847

848848
expect(error).toBeNull()
849849
})
850+
851+
it("does not crash when the factory function self-references its enhanced self", () => {
852+
let nSubscriptions = 0
853+
const [, me$] = bind(
854+
(key: number): Observable<number> => {
855+
nSubscriptions++
856+
return me$(key).pipe(
857+
take(1),
858+
map((x) => x * 2),
859+
)
860+
},
861+
(key: number) => key,
862+
)
863+
864+
let value = 0
865+
const sub1 = me$(5).subscribe((val) => {
866+
value = val
867+
})
868+
869+
expect(value).toBe(10)
870+
expect(sub1.closed).toBe(false)
871+
872+
value = 0
873+
const sub2 = me$(5).subscribe((val) => {
874+
value = val
875+
})
876+
877+
expect(value).toBe(10)
878+
expect(nSubscriptions).toBe(1)
879+
880+
sub1.unsubscribe()
881+
sub2.unsubscribe()
882+
883+
const sub3 = me$(5).subscribe((val) => {
884+
value = val
885+
})
886+
887+
expect(value).toBe(10)
888+
expect(nSubscriptions).toBe(2)
889+
sub3.unsubscribe()
890+
})
850891
})
851892
})
852893
})

packages/core/src/bind/connectFactoryObservable.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ export default function connectFactoryObservable<A extends [], O>(
4747
}
4848

4949
const sharedObservable$ = shareLatest(
50-
getObservable(...input),
50+
new Observable<O>((observer) =>
51+
getObservable(...input).subscribe(observer),
52+
),
5153
getDefaultValue(...input),
5254
false,
5355
() => {

0 commit comments

Comments
 (0)