如何仅在有效值后才在 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 时会出现类型错误,因为 yX | 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;
            }));
}

非常方便。