Подтвердить что ты не робот

Как использовать 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 для этих функций выглядят мертвыми

------ edit -----

Некоторая дополнительная отладка:

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 ]
4b9b3361

Ответ 1

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

Вот как это делается в v5:

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

Ответ 2

Вот пример с вашим кодом 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 может передавать только последний элемент массива.