代码之家  ›  专栏  ›  技术社区  ›  John Doe

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

  •  0
  • John Doe  · 技术社区  · 6 年前

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

    例如,我收到'null'、'null'并且只在这个数组之后有数据

    例如:

    this.someStream$.subscribe((data: any[]) => {
      if (data) {
        this.someVar= data.map(item => new SomeModel(item ));
    });
    

    “如何避免” if (data) {}

    2 回复  |  直到 6 年前
        1
  •  5
  •   ggradnig    6 年前

    正如建议的那样 filter pipe完成了这项工作,但您显然不希望有条件的,这可以从详细的角度来理解。这不是很漂亮,对吧?

    filter(data => data !== undefined)
    filter(data => !!data)
    

    !== 还是速记 !!data .

    Boolean 建造师。它是一个带有签名的函数 (any) => boolean ,这就是为什么您可以这样做:

    filter(Boolean)
    

    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 |未定义 进入之内 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;
                }));
    }
    

    非常方便。

        2
  •  0
  •   Hardik Pithva    6 年前

    你可以使用 filter 为此目的:

    this.someStream$
      .filter(data => data !== null || typeof data != "undefined")
      .subscribe((data: any[]) => {
        this.someVar = data.map(item => new SomeModel(item));
      });