Max*_*x K 0 subscription rxjs typescript angular
仅在有效值后如何在 Rx 订阅中执行某些操作?
例如,我收到 'null'、'null' 并且只有在这个带有数据的数组之后
例如:
this.someStream$.subscribe((data: any[]) => {
if (data) {
this.someVar= data.map(item => new SomeModel(item ));
});
Run Code Online (Sandbox Code Playgroud)
如何避免“ if (data) {}”
正如建议的那样,filter管道可以完成这项工作,但您显然不希望有条件,这可以从冗长的角度来理解。这不是很漂亮,对吧?
filter(data => data !== undefined)
filter(data => !!data)
Run Code Online (Sandbox Code Playgroud)
有两种解决方案可以避免!==或 简写!!data。
首先,您可以使用Boolean构造函数。这是一个带有签名的函数(any) => boolean,这就是为什么你可以这样做:
filter(Boolean)
Run Code Online (Sandbox Code Playgroud)
但是要小心,als 假值 (false, "", 0) 也会以这种方式过滤。它只能保存与object.
更好、更可重用的是创建一个自己的操作符,它看起来像这样:
function filterEmpty<T>(): MonoTypeOperatorFunction<T> {
return (source: Observable<T>) => source.pipe(filter(val => val != undefined));
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将它与您的代码示例一起使用:
this.someStream$
.pipe(filterEmpty())
.subscribe((data: any[]) => {
this.someVar = data.map(item => new SomeModel(item ));
});
Run Code Online (Sandbox Code Playgroud)
类型
这种方法还有另一个问题,那就是类型。
想象一下:
class X {
public a;
}
let x: X | undefined = undefined;
of(x)
.pipe(filter(y => !!y))
.subscribe(y => {
let i = y.a;
});
Run Code Online (Sandbox Code Playgroud)
当分配给我们将会得到一个类型的错误i作为,y就是X | undefined。很不幸。
但是使用这个类型的运算符,我们可以转换X | undefined为X:
export function filterNullable<T>(): OperatorFunction<T | undefined, T> {
return (source: Observable<T | undefined>) => source.pipe(
filter<T | undefined, T>(
function (val: T | undefined): val is T {
return val !== undefined;
}));
}
Run Code Online (Sandbox Code Playgroud)
非常便利。