RxJS if-else 类似管道过滤

Posted

技术标签:

【中文标题】RxJS if-else 类似管道过滤【英文标题】:RxJS if-else like pipe filtering 【发布时间】:2019-07-01 23:59:50 【问题描述】:

我不擅长 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
  

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

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

我怎样才能做到这一点?谢谢。

编辑:AJT_82 的评论

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

所以我试着让它更简单:

if (isImage(this.file)) 
    this.resizeImage();

this.generateThumb();

return of(this);

失败了。

【问题讨论】:

您能告诉我们您为解决此问题所做的尝试吗? @AJT_82 检查编辑 【参考方案1】:

我认为你可以使用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,将图像与 noImages 合并,并将generateThumb 应用于合并的 observable

link to docs

【讨论】:

我现在要出去了,等我回来再试试。谢谢。 你试过了吗? 对不起,伙计,我忘记了这篇文章。我没有尝试你的方式,因为我不再需要了,因为我的问题实际上是由我使用的库上的错误引起的。我试图修复它,但最后我找到了一种方法来修复它,添加一个 if else。还是谢谢你。

以上是关于RxJS if-else 类似管道过滤的主要内容,如果未能解决你的问题,请参考以下文章

笑话:模拟 RxJs 管道

在可管道 rxjs 运算符的组合管道中捕获错误

Angular/Rxjs 管道异步不适用于 s-s-r?

从角度服务通过管道传输时,rxjs catchError 不起作用

当我尝试在 if-else 方法中使用动画骨架小部件时出现错误 '_debugLifecycleState != _ElementLifecycle.defunct': is not true。”

RxJs 管道和 lettable 运算符“map”:“void”类型的“this”上下文不可分配给“Observable<>”类型的方法“this”