2017-04-25 35 views
2

望着definitioncombineLatestcombine在Rxjs 5中的最大行爲?

結合多種觀測量,以創建一個可觀察其值 從它的每個輸入觀測值的最新值來計算。

每當任何輸入可觀察發出的值,它使用從所有輸入的最新值計算出一個公式 ,然後發射的 ,式輸出。

enter image description here

,很明顯地看到,在時間/發射的每一個時期,在這個發射的結果是最新排放的組合。

如果是這樣,看着這個代碼

const obs1 = Rx.Observable.of(1, 2, 3, 4, 5); 
const obs2 = Rx.Observable.of('a', 'b', 'c') 
const obs3 = obs2.combineLatest(obs1, (a, b) => a+b); 

const subscribe = obs3.subscribe(latestValues => { 
    console.log(latestValues ); 
}); 

結果是:

c1,c2,c3,c4,c5 

當我改變

obs2.combineLatest(obs1.. 

obs1.combineLatest(obs2.. 

- 我得到5a,5b,5c

問:

的文檔沒有指定有關調用的順序有什麼區別(如果有的話 - 爲什麼我得到不同的結果)?爲什麼我看不到其他來源的其他組合?似乎有一個來源正在取其最後一個值,然後只有 - 將它加入來自其他來源的每個值。

好像這是什麼實際發生的事情:

[other source]---a---b---c------------------------ 
[first source]-------------1----2-----3-----4----5 
[result]-------------------c1---c2----c3----c4---c5 

當我換的順序(OBS1 < - > OBS2):

[first source]-----1--2---3--4--5---------------- 
[other source]---------------------a-----b------c 
[result]---------------------------5a----5b-----5c 

這是怎麼回事?爲什麼一個流必須完成才能啓動連接?

爲什麼我沒有看到這樣的事情(或變化):

[first source]-----1-----2--------3-------4------5--- 
[other source]---------a-----b------c---------------- 
[result]---------------1a------2b------3b---4c-------5c 

JSBIN

回答

3

這是因爲從源觀測量值,除非您使用調度同步emited。這意味着第一個obs1發射所有值,只有最後一個被combineLatest記住,並且obs2開始發射其所有值(如果切換兩個可觀測量,則相同應用)。現在combineLatest具有兩個觀測值的值,所以來自第二觀測值的任何輻射都會使操作員發出一個值。

爲什麼它的工作原理是因爲Observable.of在內部實現爲ArrayObservable,默認情況下它不使用任何調度程序。這意味着它的所有排放都是同步發生的。請參見https://github.com/ReactiveX/rxjs/blob/master/src/observable/ArrayObservable.ts#L118

順便說一句,您可以將Rx.Scheduler.async作爲最後一個參數添加到兩個源Observable中。

+0

那麼rx4會發出不同的結果? –

+0

我認爲RxJS 4默認使用所謂的* immediate * scheduler,所以結果很可能與rxJS 5不同。 – martin