仅在有效值后如何在 Rx 订阅中执行某些操作?

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

ggr*_*nig 5

正如建议的那样,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 | undefinedX

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)

非常便利。