可以订阅对本地引用的Observable的订阅吗?

时间:2020-04-12 23:10:28

标签: javascript angular rxjs garbage-collection observable

直接订阅从方法返回的Observable是否是一种好习惯?
在调用回调方法之前会被垃圾回收吗?
例如,我在使用方法:

get<City>(id): Observable<City> {
    var url = this.baseUrl + "api/Cities/" + id;
    return this.http.get<City>(url);
}

然后在组件中我拥有:

ngOnInit () {
    this.cityService.get<City>(this.id)
            .subscribe(result => {
                 this.city = result;          
            }, 
            error => console.error(error));
}

即使在10分钟之后,也可以随时调用回调方法,并且Observable已经超出范围。
那么在糟糕的情况下,返回的Observable是否可以在回调方法中分配城市之前被垃圾回收?

2 个答案:

答案 0 :(得分:0)

只要某些代码段可以访问一个对象,就不会对该对象进行垃圾回收。

因此,是的,根据其实现,可以将Observable进行gc处理,同时某些代码仍保留对回调的引用,从而可以对其进行调用。但是,如果以这种方式实现,则可观察的对象与回调之间不存在依赖关系,因此代码将完全正常工作。所以那真的不是一个坏情况。

但是我想Observable不仅提供了.subscribe方法,而且还有一些其他属性来管理回调。在这种情况下,将在实际持有对Observable的引用时回调的代码,而Observable本身则对某个地方的回调进行了引用。在这种情况下,只有在可观察对象得到gc'ed后,回调才会被gc'ed,并且只有在代码不再拥有引用的情况下(例如,如果它停止产生新事件。

答案 1 :(得分:0)

两种情况:

  1. 您正在使用短命 Observable,然后Subscription结束会导致可观察到的complete(),现在可以在执行后对其进行垃圾回收他的回叫
  2. 您正在使用万岁 Observable,那么Subscription必须在subs.unsubscribe()之前手动完成。在该订阅保留对Observable的引用之前,因此不能在取消订阅之前对其进行垃圾回收

方法http.get是短暂的Observable,因此您处于案例2。根据垃圾回收,两种情况都很好