你需要退订Angular 2 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()); ... 

所以答案是否定的,你不会自己清理

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

在这里输入图像说明

注意如何在得到结果后运行“完成”。 这意味着它完成时会取消订阅。 所以你不需要自己做。

这是一个testing来validation:

  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自动取消订阅! 感谢rubyboy在这方面的帮助..

调用unsubscribe方法相当于取消正在进行的HTTP请求,因为此方法调用基础XHR对象上的abort方法,并删除有关加载和错误事件的侦听器:

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

也就是说, unsubscribe将删除监听器…所以这可能是一个好主意,但我不认为这是必要的单个请求;-)

希望它能帮助你,Thierry