你需要退订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