直接订阅从方法返回的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是否可以在回调方法中分配城市之前被垃圾回收?
答案 0 :(得分:0)
只要某些代码段可以访问一个对象,就不会对该对象进行垃圾回收。
因此,是的,根据其实现,可以将Observable进行gc处理,同时某些代码仍保留对回调的引用,从而可以对其进行调用。但是,如果以这种方式实现,则可观察的对象与回调之间不存在依赖关系,因此代码将完全正常工作。所以那真的不是一个坏情况。
但是我想Observable不仅提供了.subscribe
方法,而且还有一些其他属性来管理回调。在这种情况下,将在实际持有对Observable的引用时回调的代码,而Observable本身则对某个地方的回调进行了引用。在这种情况下,只有在可观察对象得到gc'ed后,回调才会被gc'ed,并且只有在代码不再拥有引用的情况下(例如,如果它停止产生新事件。
答案 1 :(得分:0)
两种情况:
Observable
,然后Subscription
结束会导致可观察到的complete()
,现在可以在执行后对其进行垃圾回收他的回叫Observable
,那么Subscription
必须在subs.unsubscribe()
之前手动完成。在该订阅保留对Observable的引用之前,因此不能在取消订阅之前对其进行垃圾回收方法http.get
是短暂的Observable,因此您处于案例2。根据垃圾回收,两种情况都很好。