【问题标题】:Can subscription to locally referenced Observable be garbage collected?订阅本地引用的 Observable 可以被垃圾收集吗?
【发布时间】:2020-04-12 23:10:28
【问题描述】:

直接订阅从方法返回的 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 可以被垃圾回收呢?

【问题讨论】:

  • 我不这么认为。那会破坏Promise

标签: javascript angular rxjs garbage-collection observable


【解决方案1】:

只要有一段代码可以访问一个对象,这个对象就不会被垃圾回收。

所以是的,根据它的实现,Observable 可以被 gc'ed 而一些代码仍然持有对回调的引用,因此可以调用它。但是,如果实现是这种方式,则可观察对象和回调之间没有依赖关系,因此代码将完全正常工作。所以这并不是一个糟糕的场景。

我猜想 Observable 不仅提供了一个.subscribe 方法,而且还提供了一些其他属性来管理回调发生。在这种情况下,将在某些时候回调的代码实际上持有对 Observable 的引用,而 Observable 本身在某处持有对回调的引用。在这种情况下,只有当 observable 被 gc'ed 时,回调才会被 gc'ed,并且只有当代码不再持有引用时才会发生这种情况,例如如果它停止产生新事件。

【讨论】:

    【解决方案2】:

    两种情况:

    1. 您正在使用 短暂的 Observable,然后 Subscription 完成导致 Observable complete(),现在可以在执行他的回调后进行垃圾收集
    2. 您正在使用万岁Observable,然后Subscription 必须由subs.unsubscribe() 手动完成。直到订阅保留对 Observable 的引用,所以在取消订阅之前不能被垃圾收集

    http.get 方法是一个短暂的 Observable,所以你属于情况 2。根据垃圾收集,这两种情况都很好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2012-06-23
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多