angular - 如何在定义观察者时在第一次发射时取消订阅 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");
我以前从未见过这个,我认为在某些场合它很方便。让我感到困惑的是观察者正在调用同一行中定义的订阅。这是好习惯吗?有没有其他方法可以实现这一目标?
谢谢!
解决方案
您可以使用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 });
});
推荐阅读
- amazon-web-services - AWS NAT over Direct Connect
- python - 如何从长度不均匀的列表中创建分组条形图
- python - 如何在类之外打印变量?
- c - 每当我尝试拆分字符串时都会遇到内存问题
- node.js - 如何显示将用户 ID 添加到 const 的消息作者头像
- jquery - 将错误从 Nodejs express 发送到 Jquery
- r - 对数赔率公式
- r - 使用 pivot_longer 函数从多个原始列创建两列的建议
- php - 如何在 PHP 中从字符串中扩展对象属性和局部变量
- reactjs - 与 if / else 反应的问题