2016-12-25 50 views
1

我有以下代碼:爲什麼Rx.Observable.of(真)開始發射

console.log('start'); 
 

 
//emit value every second 
 
const message = Rx.Observable.interval(1000); 
 
//emit value as soon as subscribed 
 
const trueObs =() => Rx.Observable.of(true); 
 
// start emitting delayed values as soon as trueObs emits 
 
const delayWhenExample = message.delayWhen(trueObs); 
 
//log values start logging after one second 
 
//ex. output: 0...1...2...3 
 
const subscribe = delayWhenExample.subscribe(val => console.log(val));
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.umd.js"></script>

爲什麼Rx.Observable.of(true)開始不subscribe可觀察到發射值?
我理解到RxJS作爲懶惰評估的概念,它不會發出值,直到我問它。

+2

我不確定我是否理解這個問題。你在最後一行叫'訂閱'。 –

+0

但我確實訂閱'message' observable不是'delayForFiveSeconds' –

回答

1

您的變量delayWhenExample實際上是一個可觀察的SubscriptionDelayObservable,它是通過調用delayWhen()創建的。它會跟蹤原始的message observable和您作爲參數傳遞給它的觀察值(delayForFiveSeconds)。當你致電subscribe()時,它也會在幕後訂閱這兩個觀測值,它們需要計算它的值。

這實在是懶惰評估的整個想法。你訂閱你需要的觀測值,而它所依賴的所有其他觀測值將自動訂閱 - 但僅在必要時訂閱。取消訂閱也是自動完成的,當組合來自許多不同來源的數據時非常方便。

+0

非常感謝您的幫助。 –

1

我不是太熟悉Rxjs V5但這裏可能是發生了什麼事:

  • 您訂閱delayByExample,這是message.delayWhen(delayForFiveSeconds)
  • 此輪流導致訂閱delayForFiveSeconds作爲可能的delayWhen操作訂閱它的兩個操作數,即delayWhen(message, delayForFiveSeconds)導致同時訂閱messagedelayForFiveSeconds,然後當從delayForFiveSeconds接收到值時,從message讀取的值被向前傳遞。但這兩種訂閱都是在訂閱delayWhen時發生的。
  • 最後一件事是,Rx.Observable.of(true)將同步發出關於認購
  • 所以,如果你想了解訂閱發生的更精確的鏈條,你可以參考delayWhenExample.subscribe(val => console.log(val))將立即觸發的true

排放下面SO回答附帶說明的數據流: