angular - 订阅后立即响应
问题描述
这是我的理论服务:
@Injectable({
providedIn: 'root'
})
export class DataService {
@Output() data: EventEmitter<number> = new EventEmitter();
constructor() {
setInterval(() => {
this.data.emit(Math.random());
}, 1e3);
}
}
我的组件:
ngOnInit() {
this.sub = this.dataService.data.subscribe(data => this.data = data);
}
ngOnDestroy() {
this.sub.unsubscribe();
}
效果很好,我有新数据。但是如何更改我的 DataService 以在订阅后立即提供数据。我的意思是,我想存储最后一个数据(在这种理论情况下是随机数)并在订阅后立即提供。这甚至可以使用 rxjs 吗?
解决方案
不要使用事件发射器代替主题,它们不能保证始终遵循可观察合同
不要在服务中使用输出,它仅适用于组件和指令
使用行为主体让新订阅者在订阅时立即获得最后发出的值
将主题设为私有并公开可观察对象的良好做法
像这样:
@Injectable({
providedIn: 'root'
})
export class DataService {
private data: BehaviorSubject<number> = new BehaviorSubject(null); // initialize to whatever
data$: Observable<number> = this.data.asObservable();
constructor() {
setInterval(() => {
this.data.next(Math.random()); // use next for subjects
}, 1e3);
}
}
推荐阅读
- python - 如何从 Python 中的 Json 获取起源-命运矩阵?
- javascript - 如何在 for 循环中等待响应?
- database - 如何在没有主键的情况下生成 gii crud Yii2?
- apache-camel - Redhat JBoss Fuse & Apache Camel - 如何使用 3 个文件嵌套路由 XML?
- excel - 使用来自变量的数据更新 Excel 用户表单中的多个文本框
- vba - 将已打开的一个数据表中的 VBA 信息复制到其他位置的其他数据表
- magento2 - 如何在 magento 2.2 中调用外部 API?
- mysql - 上周发生了一些事情,但本周没有发生 mysql 查询
- python - 访问 Zarr 中的一个块
- angular - 找不到“AppModule”的 NgModule 元数据中的错误