RxJS if-else类似于管道过滤

时间:2019-02-07 19:12:29

标签: node.js angular rxjs

我对JS和RxJS不好,所以,如果我的问题很愚蠢,对不起。

我有这个代码;不是我写的:

  prepare(): Observable<any> {
    const i = of({}).pipe(
      // Check if file type is image
      filter(() => isImage(this.file)),
      switchMap(() => this.generateThumb()),
      switchMap(() => this.resizeImage()),
      take(1)
    );

    return i
  }

但是我需要第二件事。如果文件类型不是图像:

  1. 如果文件是图像,请调整图像大小并生成缩略图。
  2. 如果文件不是图像,则仅生成缩略图。

我该如何实现?谢谢。

编辑:针对AJT_82的评论

我真的不知道这里发生了什么。为什么要先创建一个可观察的对象,对其进行管道传输,对其进行过滤等。

所以我试图使其更简单:

if (isImage(this.file)) {
    this.resizeImage();
}
this.generateThumb();

return of(this);

失败。

1 个答案:

答案 0 :(得分:3)

我认为您可以使用partition运算符:

它看起来应该像:

const source = of({});
const [images, notImages] = source.pipe(partition(() => isImage(this.file));

merge(
  images.pipe(
    switchMap(() => this.resizeImage()),
  )
  notImages
)
.pipe(switchMap(() => this.generateThumb())),
.subscribe(...);

分区将。让您观察到图像,再观察到noImages

对图像应用resizeImages,将图像与noImage合并,对合并的可观察对象应用generateThumb

link to docs