你需要取消订阅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());
            ...

当前回答

RxJS的可观察对象基本上是相关联的,并根据订阅它来工作。当我们创建可观察对象并完成移动时,可观察对象自动关闭并取消订阅。

他们的工作方式与看守者相同,但顺序完全不同。 最好的做法是在组件被销毁时取消订阅。我们随后可以通过例如。manageSubscription.unsubscibe美元。()

如果我们像下面提到的语法一样创建了可观察对象

** return new Observable((observer) => { ** //在冷状态下是可观察的 * * observer.complete () * *}) **

其他回答

你绝对应该读读这篇文章。它向您展示了为什么您应该始终取消订阅,甚至从http。

如果在创建请求之后,但在接收到来自的应答之前 后端,您认为组件是不必要的,并销毁它,您的 订阅将这样维护对组件的引用 造成内存泄漏的机会。

更新

上面的断言似乎是正确的,但无论如何,当答案返回时,http订阅无论如何都会被销毁

调用unsubscribe方法更像是取消一个正在进行的HTTP请求,因为这个方法在底层XHR对象上调用abort方法,并在load和error事件上删除侦听器:

// From the XHRConnection class
return () => {
  _xhr.removeEventListener('load', onLoad);
  _xhr.removeEventListener('error', onError);
  _xhr.abort();
};

也就是说,取消订阅会删除听众……所以这可能是一个好主意,但我不认为这是必要的单一请求;-)

希望它能帮助到你, 亨利

你不应该取消自动完成的观察对象的订阅(例如Http,调用)。但是有必要取消订阅无数个可观察对象,比如Observable.timer()。

有助于理解这一点的一个很好的方面是,除非调用订阅函数,否则不会发出HTTP请求。虽然本页上的答案似乎建议了两种不同的做法,但它真的没有多大意义 正如angular文档所指出的那样,所需的行为将由异步管道控制(尽管在后面的“发出DELETE请求”一节中会提到):

AsyncPipe自动为您订阅(和取消订阅)。

事实上,在文档中更难找到通过调用unsubscribe函数显式取消订阅这些可观察对象的例子。

所以答案是不,你不需要。Ng2会自行清理。

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

注意它在得到结果后是如何运行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),所以我们可以在它全部完成和完成时检查可观察对象的状态。

结果是

所以,Ng2自动退订时不会有泄漏!

值得一提的是:这个可观察对象被归类为有限的,与无限的可观察对象相反,无限的可观察对象是一个无限的数据流,可以像DOM点击侦听器一样发出。

谢谢@rubyboy的帮助。