angular - 是否有必要取消订阅由 Http 方法创建的可观察对象?

标签 angular memory-leaks rxjs angular2-http

您是否需要取消订阅 Angular 2 http 调用以防止内存泄漏?

 fetchFilm(index) {
        var sub = this._http.get(`http://example.com`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilm(json));
            })
            .subscribe(e=>sub.unsubscribe());
            ...

最佳答案

所以答案是否定的,您不需要。 Ng2 会自行清理。

Http服务源码,来自Angular的Http XHR后端源码:

enter image description here

注意它是如何在得到结果后运行 complete() 的。这意味着它实际上在完成时取消订阅。所以您不需要自己做。

这是一个验证测试:

  fetchFilms() {
    return (dispatch) => {
        dispatch(this.requestFilms());

        let observer = this._http.get(`${BASE_URL}`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilms(json.results));
                dispatch(this.receiveNumberOfFilms(json.count));
                console.log("2 isUnsubscribed",observer.isUnsubscribed);
                window.setTimeout(() => {
                  console.log("3 isUnsubscribed",observer.isUnsubscribed);
                },10);
            })
            .subscribe();
        console.log("1 isUnsubscribed",observer.isUnsubscribed);
    };
}

正如预期的那样,您可以看到它总是在获取结果并完成可观察运算符后自动取消订阅。这发生在超时 (#3) 上,因此我们可以在所有完成和完成时检查可观察对象的状态。

结果

enter image description here

因此,当 Ng2 自动取消订阅时,不会存在泄漏!

值得一提的是:这个 Observable 被归类为 finite,与 infinite Observable 相反例如,可以像 DOM click 监听器一样发出无限的数据流。

感谢@rubyboy 的帮助。

关于angular - 是否有必要取消订阅由 Http 方法创建的可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042929/

相关文章:

visual-c++ - 如果内存泄漏会发生什么?

html - 创建可重用 Angular UI 组件的最佳方法

javascript - ngModel 反射(reflect)到所有文本区域

unit-testing - Angular2 组件测试。 Karma 没有加载 templateUrl

angular - Ionic2 下拉刷新功能

angular - 显示来自 angularfire2 查询的单个项目

javascript - RxJS 重试未按预期运行?

Angular2 异常 : No provider for e! (e -> e)

c++ - 如何在 C++ 中制作 Qt GUI 应用程序而不会发生内存泄漏

javascript - Node.js 网络套接字内存泄漏?