我开始使用RxJs(使用v5测试版),但不知怎的,我无法弄清楚如何使用它distinctUntilChanged
.如果我在babel-node中运行它,下面代码的输出是
[ 'a', 1 ]
{ key: 'a', state: 1 }
Next: { value: 42 }
Completed
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的.为什么只有一个条目通过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
Run Code Online (Sandbox Code Playgroud)
这是代码
import {Observable} from 'rxjs'
Observable.of(['a', 1], ['a', 1], ['a', 0], …
Run Code Online (Sandbox Code Playgroud) 在 rxjs 流中,我使用distinctUntilChanged
lodashisEqual
来过滤掉重复值。但是,它似乎没有按预期工作。取下面的代码片段
import { isEqual } from 'lodash-es';
let cachedValue: any;
function testFn(observableVal: Observable<any>) {
return observableVal
.pipe(
distinctUntilChanged(isEqual),
tap(val => {
const equal = isEqual(cachedValue, val);
console.log('"output":', equal, cachedValue, val);
cachedValue = val;
})
)
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望函数const equal
内部tap
永远不会=== true
. 我希望这distinctUntilChanged(isEqual)
会过滤掉任何值,其中isEqual(cachedValue, val) === true
-->const equal === false
总是意味着。但是,控制台输出显示:
"output": false undefined [ContactList]
"output": true [ContactList] [ContactList]
"output": true [ContactList] [ContactList]
"output": true …
Run Code Online (Sandbox Code Playgroud)