gpt4 book ai didi

Rxjs `distinctUntilChanged()`似乎无法正常工作

转载 作者:行者123 更新时间:2023-12-03 16:06:40 24 4
gpt4 key购买 nike

在rxjs流中,我将distinctUntilChanged与lodash的isEqual一起使用,以过滤出重复的值。但是,它似乎无法正常工作。采取以下代码片段

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;
})
)
}

在此示例中,我希望 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 [ContactList] [ContactList]

我是否误解了 distinctUntilChanged()运算符的工作原理?我已经发布了一个简化的示例,因为实际的rxjs流非常复杂,但是我不希望这种复杂性对 const equal=== false运算符中总是 tap产生任何影响。

我只是想了解发生了什么,因此感谢您提供任何信息。谢谢!

更新

应该注意的是,如果我将代码更改为:

function testFn(observableVal: Observable<any>) {
return observableVal
.pipe(
filter(val => {
const equal = isEqual(cachedValue, val);
cachedValue = val;
return !equal;
}),
tap(val => {
console.log('"output":', val);
})
)
}

然后,筛选将按预期工作。 I was under the impression that distinctUntilChanged(isEqual) was equivalent to:
filter(val => {
const equal = isEqual(cachedValue, val);
cachedValue = val;
return !equal;
})

我是否误解了 distinctUntilChanged 运算符?

最佳答案

我想到了!感谢rxjs issue中的注释:我无意中多次订阅了可观察的消息(这本不应该发生)。多个console.log实例来自不同的订阅实例。

关于Rxjs `distinctUntilChanged()`似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54856654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com