选择正确的RxJS构造以确保一个订阅在另一个订阅之前完成

时间:2016-09-27 19:28:27

标签: rxjs observable rxjs5 ngrx

我正面临 RxJS 问题。

我的应用目前设计如下:我有两个不同的客户:ClientA& ClientB订阅了两个不同的Observable:ObservableA& ObservableB

请注意,该应用程序还会更改名为aVariable的变量。

以下是流程:

  1. ClientA订阅了ObservableA
  2. ClientB订阅了ObservableB
  3. ObservableB订阅从false读取aVariable并完成。
  4. ObservableA订阅将aVariable设置为true并完成(晚于ObservableB)。
  5. 真正意图的是ObservableA订阅在ObservableB之前完成,以便ClientBtrue读取aVariable {1}} ...或者换句话说,以某种方式确保ObservableB的订阅等待其他订阅完成。

    我不确定使用什么RxJS构造来实现我想要的(我目前使用普通的Observables)。我相信我需要的不仅仅是普通的Observables ......

    有人可以帮忙吗?

    P.S。 请注意aVariable保存在 ngrx商店中,但我认为这与此问题无关...

    P.P.S。 以上是我真实应用的简化。

1 个答案:

答案 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;
&#13;
&#13;

只有在streamB订阅它之后,才会在completeStreamA主题中输入一个值,该值将完成streamA。上面代码的输出:

a->complete
b->next->aValueOnStreamB
b->complete