2016-08-01 9 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に連鎖された資格情報を取得するたびに放出されます。これは、私が行ったコンパレータ関数が全く呼び出されない理由についても説明しています。たびに値が1つしかないので、比較する必要はありません。

関連する問題