25

RxJs (v5 ベータ版を使用) を使い始めていますが、どういうわけかdistinctUntilChanged. 以下のコードをbabel-nodeで実行した場合の出力は

[ 'a', 1 ]
{ key: 'a', state: 1 }
Next:  { value: 42 }
Completed

それは私が期待するものではありません。エントリが 1 つしか渡されないのはなぜdistinctUntilChangedですか? 私は出力が

[ 'a', 1 ]
[ 'a', 0 ]
[ 'a', 1 ]
{ key: 'a', state: 1 }
{ key: 'a', state: 2 }
{ key: 'a', state: 0 }
{ key: 'a', state: 1 }
Next:  { value: 42 }
Next:  { value: 24 }
Completed

これがコードです

import {Observable} from 'rxjs'

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1])
  .distinctUntilChanged(x => x[1])
  .subscribe(x => console.log(x))

Observable.of({key: 'a', state: 1}, {key: 'a', state: 2}, {key: 'a', state: 0}, {key: 'a', state: 1})
  .distinctUntilChanged(x => x.state)
  .subscribe(x => console.log(x))

Observable.of({value: 42}, {value: 42}, {value: 24}, {value: 24})
  .distinctUntilChanged(x => x.value)
  .subscribe(
    function (x) {
      console.log('Next: ', x)
    },
    function (err) {
      console.log('Error: ' + err)
    },
    function () {
      console.log('Completed')
    }
  )

これらの関数の v5 ドキュメントのリンクは無効になっているようです

- - - 編集 - - -

追加のデバッグ:

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1])
  .do(x => console.log('before', x))
  .distinctUntilChanged(x => x[1])
  .do(x => console.log('after', x))
  .subscribe(x => console.log(x))

出力:

before [ 'a', 1 ]
after [ 'a', 1 ]
[ 'a', 1 ]
before [ 'a', 1 ]
before [ 'a', 0 ]
before [ 'a', 1 ]
4

2 に答える 2

36

ここで答えを得ました。基本的に、関数シグネチャは (キー セレクター、コンパレーター) から (コンパレーター、キー セレクター) に変更されました。

これは、v5 での例の実行方法です。

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1])
  .distinctUntilChanged(null, x => x[1])
  .subscribe(x => console.log(x))
于 2016-03-30T18:28:27.447 に答える