2016-04-17 23 views
1

我不完全理解這個操作符。理解組加入

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md

如何理解這些部分:

進行關聯兩個序列的基礎上重疊的持續時間的元素,並對結果進行分組。

leftDurationSelector(功能):選擇左觀察到的序列的每個元素,用於確定重疊的持續時間(表示爲一個可觀察序列)的函數。 rightDurationSelector(Function):用於選擇右側可觀察序列的每個元素的持續時間(表示爲可觀察序列)的函數,用於確定重疊。

從第四個參數:

(觀察不到)與從與左的順序的元件重疊的權利序列元件可觀察序列。

爲什麼這裏第二和第三參數是這樣嗎?定時器(0)對我們有什麼好處?我知道0秒後定時器(0)返回值0並完成。所以呢?

var xs = Rx.Observable.interval(100) 
    .map(function (x) { return 'first' + x; }); 

var ys = Rx.Observable.interval(100) 
    .map(function (x) { return 'second' + x; }); 

var source = xs.groupJoin(
    ys, 

    function() { return Rx.Observable.timer(0); }, 
    function() { return Rx.Observable.timer(0); }, 
    function (x, yy) { 
     return yy.select(function (y) { 
      return x + y; 
     }) 
    }).mergeAll().take(5); 

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

也許你知道更好的解釋來源?

回答

1

下面是你應該檢討更好地理解groupJoin來源。好奇心你用這個操作符來達到什麼目標?可能有其他方法可以做到這一點。我還沒有找到groupJoin的實用有趣用途。

我建議你複查,以便這些資源(並通過了解join開始),花有一段時間在大理石上了解發生了什麼事。

關於官方文檔例子,timer(0)基本上給出了一個滴答聲的持續時間,你選擇。持續時間選擇器僅用作信號,它們的值與輸出無關。當持續時間選擇器發出一個值或終止時,會發生事件(從兩個流中發出分組值)。雖然它們不發送數值也不終止,但也發生了一些事情(從兩個數據流中分組值)。

傳遞選擇器函數接收分組值,並從它計算其它值。通過groupJoin,該選擇器接收來自第一個源的值以及將來自第二個源的所有相關值進行分組的可觀察值,並且您可以根據需要執行任何邏輯。

+0

我只是試着去了解這一點,因爲我覺得它稍後在使用RxJS編寫代碼時可能會有用。稍後將檢查這些資源 –

0

user3743222張貼在回答之後,我把更多的時間從該頁面瞭解,我不斷地檢查reactivex,但這種功能,它是很難理解這些箭頭會從左至右角位。

有人提到了窗戶。事實證明,這些箭頭代表窗口。

第二和第三個參數是窗口寬度:

function() { return Rx.Observable.timer(500); } 

例如上面的窗口寬度是500毫秒(假設在此情況下,我們可以在時間單位測量的寬度)。

我畫的圖形看起來對我來說更像窗口:

enter image description here

所以從我的圖我們可以看到,例如黑色窗口綠色窗口相交,因此事件被功能加入第四個參數。

綠色和紅色相同。

我沒有調查其他情況,比如如果第一個流窗口中的多個事件與第二個流程相交會發生什麼情況,但至少我們知道它是如何工作的,也許其他人會添加信息,如果有的話意外的情況。

還需要0進一步調查窗口寬度,因爲視覺上看着它們不存在,我的意思是,如果有一個窗口,我想它有寬度> 0