我相信buffer
(或可能是sample
)可能會讓你走上正軌。 buffer
方法接受用於定義緩衝區邊界的Observable。得到的流發出了發出在該窗口中(例如,從RXJS文檔被盜buffer
)的任何項目:
var source = Rx.Observable.timer(0, 50)
.buffer(function() { return Rx.Observable.timer(125); })
.take(3);
var subscription = source.subscribe(x => console.log('Next: ', x));
// => Next: 0,1,2
// => Next: 3,4,5
// => Next: 6,7
所以我們現在有一個辦法讓所有流的發射事件在一定時間窗口。在你的情況,我們可以使用tick$
來形容我們的採樣週期和observ1
和observ2
是我們希望緩衝我們的基本流:
const buffered1 = observ1.buffer(tick$);
const buffered2 = observ2.buffer(tick$);
每個流會發出一次滴答$時期,會散發出來自底層流的所有排放項目清單(在此期間)。該buffered
流將發出的數據是這樣的:
|--[]--[]--[1, 2, 3]--[]-->
爲了得到你想要的輸出,我們可以選擇只查看每一個緩衝的結果的最新發出的項目,如果沒有發出的數據,我們可以通過空:
我說明
const buffered1 = observ1.buffer($tick).map(latest);
const buffered2 = observ2.buffer($tick).map(latest);
function latest(x) {
return x.length === 0 ? null : x[x.length - 1];
}
以前的樣品流現在這個樣子:
|--null--null--3--null-->
最後,我們可以zip
這兩個流來獲得「最新」我們的tick$
間隔期間發射數據:
const sampled$ = buffered1.zip(buffered2);
這sampled$
流將發射從我們的observ1
和observ2
流的最新數據在tick$
窗口。這裏有一個示例結果:
|--[null, null]--[null, 1]--[1, 2]-->
卡爾文,試過這個,我正在瞄準。我不幸仍然可以upvote,但標記爲答案。 –
很高興聽到它! –