【问题标题】:How can I unsubscribe from Observable/Subject on the first emission while defining the observer如何在定义观察者时在第一次发射时取消订阅 Observable/Subject
【发布时间】:2020-09-25 06:18:48
【问题描述】:

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

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

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");

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

谢谢!

【问题讨论】:

    标签: angular typescript observable rxjs-observables


    【解决方案1】:

    您可以使用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 });
    });
    

    【讨论】:

    • 谢谢朋友,你觉得我提出的第二种方法怎么样?
    • 我更喜欢第一个。为什么您可以手动取消订阅而可以自动取消订阅?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2019-02-24
    • 2015-04-03
    • 2021-03-17
    相关资源
    最近更新 更多