【问题标题】:How to use RxJs distinctUntilChanged?如何使用 RxJs distinctUntilChanged?
【发布时间】:2016-07-16 06:49:51
【问题描述】:

我开始使用 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 文档中这些函数的 links 似乎已失效

----- 编辑-----

一些额外的调试:

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 ]

【问题讨论】:

  • 另外,对于这种调试问题,您应该包括预期的行为,并在理想情况下显示一些调试尝试。
  • 好的,我已经添加了预期的输出

标签: javascript rxjs rxjs5


【解决方案1】:

我得到了答案here。基本上函数签名从(键选择器,比较器)更改为(比较器,键选择器)。

这就是示例在 v5 中的完成方式:

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

【讨论】:

    【解决方案2】:

    这是sample,您的代码是 Rxjs V4。你会看到它工作正常。

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

    所以它似乎与新的 beta 版本有关。这是distinctUntilChanged 的规格。运算符本身似乎与第 4 版一样工作。

    为了进行测试,我建议您通过在运算符之间插入.do(function(x){console.log(x)}) 来跟踪每个函数的输出。我只能想到of 运算符可能只传递数组的最后一个元素。

    【讨论】:

    • 好的,您现在可以尝试使用Observable.from 而不是Observable.of(尽管将所有数组放入一个数组中)吗?您是否也可以尝试使用of,但将'a', 1 更改为'b', 1of 运算符似乎只接受您传递的最后一个或第一个参数。
    • 我可以确认 v4 有效。看起来 v5 已损坏,或者至少他们自己的文档不正确。 “带键选择器”here 的代码与我在 v5 中遇到的问题相同,所以我想我会在 github 上为此创建一个问题
    • 嗯,它是一个测试版的权利。不要忘记为您认为有用的答案投票,并接受那些解决您问题的人。
    • 所以事实证明这不是一个错误,而是一个 API 更改。在文档可用之前,我最好坚持使用 v4,这样我就知道我在做什么了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多