未调用带有 ReplaySubject 的 forkJoin.subscribe

Ite*_*tor 2 javascript rxjs

我想创建一个 Observable,如果两个 ReplaySubject 实例都持有一个值,它就会触发。我尝试过这样的:

let v1 = new Rx.ReplaySubject();
let v2 = new Rx.ReplaySubject();

v1.next('X');

const combo = Rx.Observable.forkJoin(v1, v2)

combo.subscribe( arr => console.log(arr) )

v1.subscribe( s => console.log('v1', s) );
v2.subscribe( s => console.log('v2', s) );

v2.next('Y');
Run Code Online (Sandbox Code Playgroud)

两者v1.subscribev2.subscribe被称为 ,但不是combo.subscribe。我有什么错吗?如何解决这个问题?

Jef*_*amp 5

forkJoin仅当所有输入可观察值完成后,才会发出包含所有最后值的数组。如果您手动完成v1v2,combo将发出:

let v1 = new rxjs.ReplaySubject();
let v2 = new rxjs.ReplaySubject();

v1.next('X');
v2.next('Y');
v2.next('Z'); // This additional value should demonstrate the idea of forkJoin

const combo = rxjs.forkJoin(v1, v2)
combo.subscribe( arr => console.log(arr) )

v1.complete();
v2.complete();
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.js"></script>
Run Code Online (Sandbox Code Playgroud)

combineLatest如果您不希望内部可观察量完成,您可能会寻找:

let v1 = new rxjs.ReplaySubject();
let v2 = new rxjs.ReplaySubject();

v1.next('X');
v2.next('Y');

const combo = rxjs.combineLatest(v1, v2)
combo.subscribe( arr => console.log(arr) )
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.js"></script>
Run Code Online (Sandbox Code Playgroud)