首页 > 解决方案 > 如何在定义观察者时在第一次发射时取消订阅 Observable/Subject

问题描述

我正在处理一些 angular 9 的对话框,我遇到了需要在第一次发射后取消订阅主题的情况。

最初,我想使用take(1)orfirst()运算符来管道主题并订阅这个“转换的有限主题”。所以取消订阅将在第一次发射后自动处理,因为当一个可观察对象完成时,取消订阅逻辑被调用。例子:

const subject = new Subject();

subject.pipe(take(1)).subscribe(console.log);

subject.next("hola");

但是后来我也发现了这个我认为它也有效的“黑客”,有人可以确认吗?

const subject = new Subject();

const subscription = subject.subscribe((value) => {
  console.log(value);
  subscription.unsubscribe(); // <----- this is the magic line
}

subject.next("hola");

我以前从未见过这个,我认为在某些场合它很方便。让我感到困惑的是观察者正在调用同一行中定义的订阅。这是好习惯吗?有没有其他方法可以实现这一目标?

谢谢!

标签: angulartypescriptobservablerxjs-observables

解决方案


您可以使用first()take(1)。当满足条件时,两者都会自动取消订阅。

const { Subject } = require('rxjs/');
const { take, first } = require('rxjs/operators');

const subject = new Subject();

subject.pipe(first()).subscribe(data => {
  console.log({ data });
});

subject.pipe(take(1)).subscribe(data => {
  console.log({ data });
});

推荐阅读