Angular 角2订阅

Angular 角2订阅,angular,rxjs,Angular,Rxjs,有人能给我解释一下这两种订阅方式的区别吗 this.incMatService.incomingMaterialUpdate$.subscribe((model) => { try { code here } catch (error) { console.log(error); } }); this.incMatService.incomingMaterialNew$.s

有人能给我解释一下这两种订阅方式的区别吗

   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();
}
private updateIncomingMaterial=新的ReplaySubject(0);
私有addNewIncomingMaterial=新主题();
incomingMaterialUpdate$=this.updateIncomingMaterial.asObservable();
incomingMaterialNew$=this.addNewIncomingMaterial.asObservable();
更新输入材料(输入材料输出日期:输入材料){
this.updateIncomingMaterial.next(incomingMaterialToUpdate);
}
addNewIncMaterial(){
this.addNewIncomingMaterial.next();
}

我在一个组件中发出此事件,并在另一个组件中订阅,就像我在示例中所示的那样。区别在于,在第二种情况下,您将订阅存储在变量中,而在第一种情况下则不存储


你是否需要退订与此无关。如果observable的生命周期比您的组件长(即,即使在您的组件被销毁后,它仍然存在并发出事件),那么您需要取消订阅,并将订阅存储在一个变量中,以便能够执行此操作。否则,您将出现内存泄漏,并且在每次发出事件时都会继续执行代码,而不会产生任何后果。

不同之处在于,在第二种情况下,您将订阅存储在变量中,而在第一种情况下则不存储


你是否需要退订与此无关。如果observable的生命周期比您的组件长(即,即使在您的组件被销毁后,它仍然存在并发出事件),那么您需要取消订阅,并将订阅存储在一个变量中,以便能够执行此操作。否则,您将出现内存泄漏,并且在每次发出事件时都会继续执行代码,而不会产生任何后果。

在第一种情况下,您只是失去了对订阅的引用,因此您甚至无法取消订阅。通常这是在自然结束的源上完成的,所以没有必要取消。当您不再需要源时,也可以修改源以取消,而不是调用
.unsubscribe()
在第一种情况下,您只是失去了对订阅的引用,因此甚至无法取消它。通常这是在自然结束的源上完成的,所以没有必要取消。您也可以在不再需要源代码时将其修改为“取消”,而不是调用
.unsubscribe()

,因此如果我不使用变量,我将承担内存泄漏的责任?否。如果不取消订阅,您将有内存泄漏。由于您必须取消订阅,因此必须保留对订阅的引用,并将其存储在变量中,以便稍后调用unsubscribe()。因此,如何识别哪种情况更好,因为正如我在第一种情况下所理解的,我无法取消订阅,因此可能会出现内存泄漏。那么,您没有答案吗?您喜欢泄漏内存的解决方案,还是不泄漏内存的解决方案?此解决方案不:)因此,如果我不使用变量,我将承担内存泄漏的责任?不。如果您不取消订阅,您将发生内存泄漏。由于您必须取消订阅,因此必须保留对订阅的引用,并将其存储在变量中,以便稍后调用unsubscribe()。因此,如何识别哪种情况更好,因为正如我在第一种情况下所理解的,我无法取消订阅,因此可能会出现内存泄漏。那么,您没有答案吗?你喜欢一个会泄漏内存的解决方案,还是一个不会泄漏内存的解决方案?这一个不会:)那么如何识别哪种情况更好,因为正如我在第一个案例中所理解的那样,我无法取消订阅,因此可能会发生内存泄漏?@Stefan如果你正确使用
takeUntil
的话,它也不会泄漏。因为当
takeUntil
中的可观察内容触发时,它将完成并GC与流相关的所有资源。因此,如何识别哪种情况更好,因为正如我在第一种情况下所理解的,我无法取消订阅,因此可能会发生内存泄漏?@Stefan如果正确使用
takeUntil
,它也不会泄漏。因为当
takeUntil
中的observable启动时,它将完成并GC与流相关的所有资源。