您是否需要取消订阅 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后端源码:
注意它是如何在得到结果后运行 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
自动取消订阅时,不会存在泄漏!
值得一提的是:这个 Observable
被归类为 finite
,与 infinite
Observable
相反例如,可以像 DOM click
监听器一样发出无限的数据流。
感谢@rubyboy 的帮助。
关于angular - 是否有必要取消订阅由 Http 方法创建的可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042929/