2016-08-01 47 views
2

我有一個值的流,我使用下限和上限進行限制,並減少日誌記錄的數量,如果它們發生更改,我只想發出值。問題是,在下面的代碼片段第二distinctUntilChanged()仍然會產生重複:RxJs:distinctUntilChanged仍然發出重複值

Observable // emits i.e. [2, 2, 2, 5, 5, 10, 20] 
.distinctUntilChanged() // becomes [2, 5, 10, 20] 
.map(target => { 
    const correctedTarget = Math.min(Math.max(target, MINIMUM), MAXIMUM); // Let's say min: 5, max: 10 
    if(correctedTarget != target) { 
    logger.warn(`Prediction wants to scale out-of-bounds to ${target}, limiting to ${correctedTarget}`); 
    } 
    return correctedTarget; 
}) // becomes [5, 5, 10, 10] 
.distinctUntilChanged() // should be [5, 10], but is [5, 5, 10, 10] 

的RxJs文檔指出過濾器默認爲一個簡單的相等比較,所以我預計,這應該只是工作™。

+1

你完全確定你的價值觀是按順序排列的?我把你的代碼和rxjs 4一起運行,一切都很完美。 –

+0

是的,我在最後一行之前和之後添加了'.do(val => {logger.debug(value);})',可以確認它保持發出相同的值。 – Sander

+1

好的。你可以請張貼完整的示例代碼,展示這個問題?你能否也請張貼你正在使用哪個版本的rxjs?正如我所說的,我運行的快速樣本轉換工作正常。 –

回答

0

我的一位同事(再次)發現了這個問題(也感謝Matt的幫助)。事實證明,最初的假設是錯誤的 - 代碼的概要如下:

Observable // emits credentials on some interval 
.flatmap(credentials => { 
    return Observable2.doSomething() 
     .distinctUntilChanged() 
     ... 
}) 

正如你所看到的,distinctUntilChanged被拴Observable2,這是一個新的可觀察數據流的憑據得到發射每次。這也解釋了爲什麼我所做的比較函數根本沒有被調用:每次只有一個值,所以沒有什麼可比較的。