我正面临 RxJS 问题。
我的应用目前设计如下:我有两个不同的客户:ClientA
& ClientB
订阅了两个不同的Observable:ObservableA
& ObservableB
。
请注意,该应用程序还会更改名为aVariable
的变量。
以下是流程:
ClientA
订阅了ObservableA
。ClientB
订阅了ObservableB
。ObservableB
订阅从false
读取aVariable
并完成。ObservableA
订阅将aVariable
设置为true
并完成(晚于ObservableB
)。真正意图的是ObservableA
订阅在ObservableB
之前完成,以便ClientB
从true
读取aVariable
{1}} ...或者换句话说,以某种方式确保ObservableB
的订阅等待其他订阅完成。
我不确定使用什么RxJS构造来实现我想要的(我目前使用普通的Observables)。我相信我需要的不仅仅是普通的Observables ......
有人可以帮忙吗?
P.S。 请注意aVariable
保存在 ngrx商店中,但我认为这与此问题无关...
P.P.S。 以上是我真实应用的简化。
答案 0 :(得分:1)
我认为您可以使用中间主题解决您的问题,其中您在streamB订阅时发出值:
const completeStreamA = new Rx.Subject();
const streamA = Rx.Observable.never()
.takeUntil(completeStreamA);
const streamB = Rx.Observable.of('aValueOnStreamB')
.do(() => completeStreamA.next('complete stream A'));
//clientA subscribes immediately
streamA.subscribe(
next => console.log('a->next->'+next),
err => console.log('a->error->' + err.message),
() => console.log('a->complete')
);
setTimeout(() => {
//simulate later subscription by clientB
streamB.subscribe(
next => console.log('b->next->'+next),
err => console.log('b->error->' + err.message),
() => console.log('b->complete')
);
}, 3 * 1000);

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>
&#13;
只有在streamB订阅它之后,才会在completeStreamA
主题中输入一个值,该值将完成streamA。上面代码的输出:
a->complete
b->next->aValueOnStreamB
b->complete