如何使用运算符 from 处理错误 rxjs?

How to handle error rxjs using operator from?

在 ngOnChanges 中,我监听组件的输入数据。

ngOnChanges(): void {
    from(this.zuPrimaryData).pipe(
      max((a, b) => a["nu"] - b["n"])
    ).subscribe((data) => {
      console.log(data);
    });
  }

第一次 this.zuPrimaryData 出现时 null ir 出现错误,因此 ngChanges 起作用。

如何处理这个问题并且如果为 null 则不创建流?

此代码无法获取模板中的数据:

  ngOnChanges(): void {
    this.zu$ = iif(() => this.data, from(this.data)).pipe(
      max((a, b) => a["n"] - b["n"]),
      map((data) => data)
    );
  }

模板是:

{{zu$ | async }}

首先检查 this.zuPrimaryData 是否存在然后只创建流。

   ngOnChanges(): void {
      if(this.zuPrimaryData) {
        from(this.zuPrimaryData).pipe(
          max((a, b) => a["nu"] - b["n"])
        ).subscribe((data) => {
          console.log(data);
        });
      }
    }

您可以使用 rxjs 运算符提供的过滤器运算符,如下所示。只有当您 return 为真时,它才会继续。在这种情况下,当值为空时,它将转换为假,并且不会继续。

from(this.zuPrimaryData).pipe(
      filter(data=>!!data), 
      max((a, b) => a["nu"] - b["n"])
    ).subscribe((data) => {
      console.log(data);
    });

如果您需要一个纯 RxJS 解决方案,您可以使用 iif 条件函数。尝试以下

ngOnChanges(): void {
  iif(() => this.zuPrimaryData, from(this.zuPrimaryData)).pipe(
    max((a, b) => a["nu"] - b["n"])
  ).subscribe((data) => {
    console.log(data);
  });
}

此处仅当定义了 zuPrimaryData 时才会创建可观察对象。如果条件为假,它 returns RxJS EMPTY 常量。

来自 EMPTY 文档:

Creates an Observable that emits no items to the Observer and immediately emits a complete notification.

您还可以使条件更明确以便于阅读:iif(() => (this.zuPrimaryData && this.zuPrimaryData !== null), from(this.zuPrimaryData))


更新:使用 async 管道

要使用 async 管道,您需要从控制器中删除订阅。

选项 1:使用 async 管道

控制器

result$: any;

ngOnChanges(): void {
  this.result$ = iif(() => this.zuPrimaryData, from(this.zuPrimaryData))
    .pipe(max((a, b) => a["nu"] - b["n"]));
}

模板

<div>{{ result$ | async }}</div>

选项 2:使用订阅(没有 async 管道)

控制器

result: any;

ngOnChanges(): void {
  iif(() => this.zuPrimaryData, from(this.zuPrimaryData))
    .pipe(max((a, b) => a["nu"] - b["n"]))
    .subscribe(data => this.result = data);
}

模板

<div>{{ result }}</div>