Как использовать RxJS distinctUntilChanged?

Я начинаю работу с RxJs (используя бета-версию v5), но почему-то я не могу понять, как работать с distinctUntilChanged. Вывод из кода ниже, если я запускаю его в babel-node, -

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

это не то, что я ожидал. Почему проходит только одна запись 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 ]

2 ответов


Я получил ответ здесь. В основном сигнатура функции изменилась с (селектор ключей, компаратор) на (компаратор, селектор ключей).

вот как делается пример в v5:

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

здесь пример С вашим кодом Rxjs V4. Вы увидите, что он работает правильно.

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

Так что, похоже, что-то с новой бета-версией. Вот спецификации для distinctUntilChanged. Сам оператор, похоже, работает как в версии 4.

чтобы проверить вещи, я рекомендую вам отслеживать вывод каждой функции, вставляя .do(function(x){console.log(x)}) между операторами. Я могу думать только о of оператор может попутно только на последнем элементе массива.