2016-09-27 93 views
0

我正面臨RxJS問題。選擇正確的RxJS構造以確保一個訂閱在另一個訂閱完成之前完成

我的應用正在設計如下:我有兩個不同的客戶端:ClientA & ClientB預訂了兩個不同的觀測量:ObservableA & ObservableB

請注意,該應用程序還會變動一個名爲aVariable的變量。

這裏是流:

  1. ClientA訂閱了ObservableA
  2. ClientB訂閱ObservableB
  3. ObservableB訂閱閱讀falseaVariable並完成。
  4. ObservableA訂閱集aVariabletrue並完成(晚於ObservableB)。

而什麼是真正意圖是爲ObservableA S「的訂閱之前ObservableB完成」,讓ClientB將從aVariabletrue ...或者換一種方式,一定程度上保證ObservableB的訂閱等待直到其他訂閱已完成。

我不確定用什麼RxJS結構來實現我想要的(我目前使用普通Observable)。我相信我在這裏需要的不僅僅是簡單的Observable ...

有人可以幫忙嗎?

P.S. 注意aVariable是在NGRX店舉行,但我不認爲這是有關這個問題...

P.P.S. 以上是我的真實應用程序的簡化。

+0

通常,當您想要運行異步任務以便使用'concat'或'concatMap'。看到也許類似的問題http://stackoverflow.com/questions/39566268/angular-2-rxjs-how-return-stream-of-objects-fetched-with-several-subsequent/39578646#39578646和http:// stackoverflow。 com/questions/36713531/how-to-use-exhaustmap-in-reactivex-rxjs-5-in-typescript/39589408#39589408 – martin

+0

Hi Martin。唯一的麻煩是那些是不同的客戶。因此不可能使用concat。 – balteo

+0

你可以給你一個代表什麼樣的代碼樣本嗎?我不清楚:什麼是「客戶端A」?你是什​​麼意思你完成訂閱?你的意思是「普通」的「可觀察」。 – paulpdaniels

回答

1

我認爲你可以在你散發出的值時streamB被預訂了中間主題解決您的問題: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>

會接下來是將完成streamA的completeStreamA主題的值。以上代碼的輸出:

a->complete 
b->next->aValueOnStreamB 
b->complete 
相關問題