2016-12-15 34 views
1

當我應用switchMap到可觀察並返回結果,我期待的認購,結果不會導致開關地圖重新運行。switchMap調用內部函數多次

看看下面的代碼:

let myObservable = Observable.of('empty') 
    .switchMap(id => { 
     doWork(); 
     return Observable.of('test'); 
    } 
); 

myObservable.subscribe(x => console.log('subscription 1')); 
myObservable.subscribe(x => console.log('subscription 2')); 

function doWork() { 
    console.log('working!'); 
} 

它產生:

working! 
subscription 1 
working! 
subscription 2 

什麼進出口尋找是隻被調用一次的doWork方法和像這樣的輸出:

working! 
subscription 1 
subscription 2 

回答相關的其他資源:

Cold vs Hot Observables

回答

0

.subscribe()調用同一可觀察每個(默認)得到自己認購的情況下,從而讓它重新運行。如果您希望您的數據流將其結果多播到多個訂閱,則可以使用.share()

Ofcourse;即使在使用多播運營商的情況下,考慮到Rx的異步特性,第二次訂購對於初始發射值來說可能太晚了。您可以一起下探一切,當你準備好.connect()上游觀察到的使用.publish()

注(使它熱):不要share()所有的事情比比皆是;它以性能成本爲代價,因爲它會在內部創建一個引用計數器並將所有值從上游發送到所有觀察者,而不是簡單地從上游下游傳播值。

+1

謝謝你馬克。我正在研究冷與熱的可觀測量,我相信在這種情況下,我確實需要一個熱門的可觀測量。與共享執行publish()然後connect()是一樣的嗎? – cgatian

+0

當第一個流訂閱時,share()會引用並連接()。 publish()讓你在連接()之前訂閱所有東西並開始接收上游排放 –

+0

這種類型的RxJs編程是否爲反模式?我應該尋找替代方法來做到這一點? – cgatian