gpt4 book ai didi

javascript - 如何在某些可观察量中使用带有过滤器的combineLatest?

转载 作者:行者123 更新时间:2023-12-02 21:00:02 25 4
gpt4 key购买 nike

这是复杂情况的简化,如果值无效,则可以过滤数组中的某些可观察值。问题在于,过滤后的可观察值不允许其他可观察值完成组合。什么运算符(operator)或方法可以处理这种情况,允许订阅中的有效数据日志?

// RxJS v6+
import { fromEvent, combineLatest, of } from 'rxjs';
import { mapTo, startWith, scan, tap, map, filter } from 'rxjs/operators';

const userData$ = [
of({ name: 'Joseph', age: 23}),
of({ name: 'Mario', age: 33}),
of({ name: 'Robert', age: 24}),
of({ name: 'Alonso', age: 25})
];

const names = ['Joseph', 'Mario', 'Robert', 'Alonso'];

combineLatest(
names.map((name, i) => {
return userData$[i].pipe(
map(({name, age})=> { return{ name, age: age * 2} }),
filter(({age}) => age < 67),
map(({name, age})=> { return{ name: name.toLocaleUpperCase(), age} }),
)
})
)
.pipe(
tap(console.log),
)
.subscribe();

Sample in stackblitz

如果我们将值更改为 67,所有可观察量都将显示数据。

最佳答案

combineLatest 的一个典型问题是它要求所有源 Observable 至少发出一次,因此如果您使用 filter 丢弃其唯一值,则 combineLatest 永远不会发出任何东西。

一个简单的解决方案是确保它始终以 defaultIfEmpty 发出:

combineLatest(
names.map((name, i) => {
return userData$[i].pipe(
map(({name, age})=> { return { name, age: age * 2} }),
filter(({age}) => age < 66),
map(({name, age})=> { return { name: name.toLocaleUpperCase(), age} }),
defaultIfEmpty(null),
)
})
)

现场演示:https://stackblitz.com/edit/typescript-rsffbs?file=index.ts

如果您的实际用例使用除 of() 之外的其他源 Observable,并且不能立即完成,您可能需要使用 startWith 来代替。

关于javascript - 如何在某些可观察量中使用带有过滤器的combineLatest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61379837/

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