如何仅在有效值后才在 Rx 订阅中做某事?
How to do something in Rx subscription only after valid value?
如何仅在有效值后才在 Rx 订阅中执行某些操作?
例如,我收到 'null'、'null' 并且仅在此数组之后收到数据
例如:
this.someStream$.subscribe((data: any[]) => {
if (data) {
this.someVar= data.map(item => new SomeModel(item ));
});
如何避免“if (data) {}
”
您可以为此目的使用 filter
:
this.someStream$
.filter(data => data !== null || typeof data != "undefined")
.subscribe((data: any[]) => {
this.someVar = data.map(item => new SomeModel(item));
});
如建议的那样,filter
管道完成了这项工作,但您明确地不想有条件,这可以从冗长的角度理解。这不是很漂亮,对吧?
filter(data => data !== undefined)
filter(data => !!data)
有两种解决方案可以避免 !==
或 shorthand !!data
。
首先,您可以使用 Boolean
构造函数。它是一个带有签名 (any) => boolean
的函数,这就是为什么你可以这样做:
filter(Boolean)
不过要小心,als 虚假值 (false, "", 0) 也将以这种方式过滤。它只保存与 object
一起使用。
更好、更可重用的是创建一个自己的运算符,它看起来像这样:
function filterEmpty<T>(): MonoTypeOperatorFunction<T> {
return (source: Observable<T>) => source.pipe(filter(val => val != undefined));
}
然后,您可以将它与您的代码示例一起使用:
this.someStream$
.pipe(filterEmpty())
.subscribe((data: any[]) => {
this.someVar = data.map(item => new SomeModel(item ));
});
类型
这种方法还有另一个问题,那就是类型。
想象一下:
class X {
public a;
}
let x: X | undefined = undefined;
of(x)
.pipe(filter(y => !!y))
.subscribe(y => {
let i = y.a;
});
分配 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;
}));
}
非常方便。
如何仅在有效值后才在 Rx 订阅中执行某些操作?
例如,我收到 'null'、'null' 并且仅在此数组之后收到数据
例如:
this.someStream$.subscribe((data: any[]) => {
if (data) {
this.someVar= data.map(item => new SomeModel(item ));
});
如何避免“if (data) {}
”
您可以为此目的使用 filter
:
this.someStream$
.filter(data => data !== null || typeof data != "undefined")
.subscribe((data: any[]) => {
this.someVar = data.map(item => new SomeModel(item));
});
如建议的那样,filter
管道完成了这项工作,但您明确地不想有条件,这可以从冗长的角度理解。这不是很漂亮,对吧?
filter(data => data !== undefined)
filter(data => !!data)
有两种解决方案可以避免 !==
或 shorthand !!data
。
首先,您可以使用 Boolean
构造函数。它是一个带有签名 (any) => boolean
的函数,这就是为什么你可以这样做:
filter(Boolean)
不过要小心,als 虚假值 (false, "", 0) 也将以这种方式过滤。它只保存与 object
一起使用。
更好、更可重用的是创建一个自己的运算符,它看起来像这样:
function filterEmpty<T>(): MonoTypeOperatorFunction<T> {
return (source: Observable<T>) => source.pipe(filter(val => val != undefined));
}
然后,您可以将它与您的代码示例一起使用:
this.someStream$
.pipe(filterEmpty())
.subscribe((data: any[]) => {
this.someVar = data.map(item => new SomeModel(item ));
});
类型
这种方法还有另一个问题,那就是类型。
想象一下:
class X {
public a;
}
let x: X | undefined = undefined;
of(x)
.pipe(filter(y => !!y))
.subscribe(y => {
let i = y.a;
});
分配 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;
}));
}
非常方便。