RxJS如何等待两个ReplaySubject生成值,然后再继续

RxJS如何等待两个ReplaySubject生成值,然后再继续,rxjs,observable,Rxjs,Observable,我想使用以下方式进行连接: Observable.forkJoin( this.service1.dataSourceIsAReplaySubject, this.service2.dataSourceIsAnObservable) .subscribe(values => { console.log('inside subscribe values is', values); }); 但是console.log永远不会启动 我猜重播主题永远不会完成,这就是for

我想使用以下方式进行连接:

Observable.forkJoin(
    this.service1.dataSourceIsAReplaySubject,
    this.service2.dataSourceIsAnObservable)
.subscribe(values => {
    console.log('inside subscribe values is', values);
});
但是console.log永远不会启动

我猜重播主题永远不会完成,这就是forkJoin从不停止等待的原因

我试过了,但也没用。 我先尝试了回放主体,然后尝试了可观察主体,反之亦然

Observable.forkJoin(
    Observable.from(this.service1.dataSourceIsAReplaySubject),
    this.service2.dataSourceIsAnObservable)
.subscribe(values => {
    console.log('inside subscribe values is', values);
});
我还尝试调用共享方法:

Observable.forkJoin(
    this.service1.dataSourceIsAReplaySubject.share(),
    this.service2.dataSourceIsAnObservable)
.subscribe(values => {
    console.log('inside subscribe values is', values);
});

如何等待两个ReplaySubject或1个ReplaySubject和1个Observable的混合,forkJoin将不会发出值,直到传递给它的Observable完成;它发出每个可观测值的最后值

您可以使用
first
操作符确保它们已完成:

Observable.forkJoin(
    this.service1.dataSourceIsAReplaySubject.first(),
    this.service2.dataSourceIsAnObservable.first())
.subscribe(values => {
    console.log('inside subscribe values is', values);
});

正如您自己所指出的,问题在于,
forkJoin
只在所有流完成后才发出。如果要使用它,您需要确保所有流都以某种方式完成(
first()
take(1)
,等等)

不过,更好的选择可能是根据需要使用
zip
combinelateest
。实施情况将类似于:

Observable.zip(
    this.service1.dataSourceIsAReplaySubject,
    this.service2.dataSourceIsAnObservable
).subscribe(values => {
    console.log('inside subscribe values is', values);
});

// OR

Observable.combineLatest(
    this.service1.dataSourceIsAReplaySubject,
    this.service2.dataSourceIsAnObservable
).subscribe(values => {
    console.log('inside subscribe values is', values);
});
细分

将以相互锁定的步调发射两个观测值,即每次一个发射时,另一个也必须在zip发射值之前发射,虽然这很有用,但如果一个发射速度比另一个快得多,则也可能是危险的(因为这将导致幕后无限缓冲区的增长)

将等待两个流至少发射一次,然后在任何一个发射时,
combinelateest
将与另一个流的最新一个一起发射


还有第三种选择,称为。它的功能类似于
combinelatetest
,但需要注意的是,它仅在第一个流发出时发出,并在不发出的情况下以静默方式更新所有其他最新值。

此外,“继续之前”是什么意思
forkJoin
发出最后的值,然后完成,所以我不确定这里的“继续”是什么意思。ui取决于每个可观察对象生成的两个标志。最初两者都是未知的,因此ui是空白的。在单独的订阅中获取这些标志是不安全的,因为如果第一个可观察对象生成true,而第二个可观察对象稍后生成true,ui可能会闪烁。ui将有以下转换:未知+未知,真+未知,然后真+真。因此,forkjoin在这个场景中是完美的,因为一旦两个可观察对象都产生了一个值,就会设置两个标志。