Angular 2订阅

时间:2017-01-08 12:13:25

标签: angular rxjs

有人可以解释我这两种订阅方式之间的区别,第一种情况

   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();
}

我在一个组件中发出此事件,并在另一个组件中订阅,就像我在示例中所示

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

在第一种情况下,您只是丢失了对订阅的引用,因此您甚至无法取消它。通常这是在自然结束的源上完成的,所以不需要取消。您还可以使用.takeUntil(endEvent$)修改要取消的来源,而不是调用.unsubscribe()