2017-06-08 73 views
1

是否有一種簡單的方法來創建另一個偏移的observable?Rxjs:創建Observable,這是另一個可觀察的延遲偏移

例如,假設Observable1發出[1,2,3,4,5]。

我將如何從Observable1創建Observable2使得Observable2發射[1,2,3,4](因此,它發射什麼時候Observable1發出1,它發出1時Observable1發射2等)

Obs1開始 ------- 1 -------- 2 ---------- 3 ------------ 4 ---- --------- 5 ----------------->

Obs2開始 --------------- --1 ---------- ------------ 2 3 4 ------------- --------- -------->

謝謝!

+0

請說明。每當Obs2發射任何東西時,結果observable是否應該從Obs1發出最新值?或者Obs2發出的值是什麼意思,如果是的話呢?如果Obs2發出'[4,3,2,1]',那麼期望的行爲是什麼? –

+0

我沒有試圖根據Obs1和Obs2創建第三個可觀察對象。 相反,我試圖從Obs1創建Obs2,以便Obs2始終是「Obs1後面的一個值」。 這有道理嗎? – nciao

回答

3

您可以使用bufferCountmap運營商做你想要什麼:

const source = new Rx.Subject(); 
 
const offset = source.bufferCount(2, 1).map(values => values[0]); 
 

 
source.subscribe(value => console.log(`source = ${value}`)); 
 
offset.subscribe(value => console.log(`offset = ${value}`)); 
 

 
source.next(1); 
 
source.next(2); 
 
source.next(3); 
 
source.next(4); 
 
source.next(5);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

bufferCount(2, 1)將發出一個雙值每次收到值時間緩衝 - 一次有兩個緩衝區中的值,即。因此,緩衝區中的第一個值將被一個源發射所抵消。

你可以用bufferCount(2, 1)替代pairwise(),它可以做同樣的事情。

+0

啊!我沒有意識到BufferCount有第二個參數,讓你指定一個重疊的緩衝區。 謝謝! – nciao

+1

更新了提到'pairwise'的答案 - 我忘記了。 – cartant