有人可以解释我这两种订阅方式之间的区别,第一种情况
this.incMatService.incomingMaterialUpdate$.subscribe((model) => {
try {
code here
} catch (error) {
console.log(error);
}
});
this.incMatService.incomingMaterialNew$.subscribe((x) => {
try {
this.imForm = this.initImForm();
}
catch (error) {
console.log(error);
}
})
和第二种情况
subscription: Subscription;
subscriptionToAdd: Subscription;
subscription = this.incMatService.incomingMaterialUpdate$.subscribe((model) => {
try {
code here
} catch (error) {
console.log(error);
}
});
subscriptionToAdd = this.incMatService.incomingMaterialNew$.subscribe((x) => {
try {
this.imForm = this.initImForm();
}
catch (error) {
console.log(error);
}
})
我知道在第二种情况下我必须取消订阅(),我不知道在第一种情况下情况如何。
我服务的其他代码
private updateIncomingMaterial = new ReplaySubject<IncomingMaterial>(0);
private addNewIncomingMaterial = new Subject();
incomingMaterialUpdate$ = this.updateIncomingMaterial.asObservable();
incomingMaterialNew$ = this.addNewIncomingMaterial.asObservable();
updateIncMaterial(incomingMaterialToUpdate: IncomingMaterial) {
this.updateIncomingMaterial.next(incomingMaterialToUpdate);
}
addNewIncMaterial(){
this.addNewIncomingMaterial.next();
}
我在一个组件中发出此事件,并在另一个组件中订阅,就像我在示例中所示
答案 0 :(得分:3)
不同之处在于,在第二种情况下,您将订阅存储在变量中,而不是第一种情况。
您是否需要取消订阅是无关的。如果observable具有比组件更长的生命周期(即,即使在组件被销毁后它仍保持现有和发出事件),那么您需要取消订阅,从而将订阅存储在变量中以便能够执行此操作。否则,您将发生内存泄漏,并且每次发出事件时都会继续执行代码。
答案 1 :(得分:1)
在第一种情况下,您只是丢失了对订阅的引用,因此您甚至无法取消它。通常这是在自然结束的源上完成的,所以不需要取消。您还可以使用.takeUntil(endEvent$)
修改要取消的来源,而不是调用.unsubscribe()
。