Интересно, использую ли я Observable.subscribe () слишком много раз или нет.
В моем классе компонентов у меня есть функция loadData ().
Он вызывает другую функцию this.service.getData (), которая использует HttpClient.get () для выполнения HTTP-запроса к серверу.
В настоящее время в моей функции loadData () я подписываюсь на результат this.service.getData ().
Каждый раз, когда пользователь нажимает кнопку «Обновить», я хотел бы вызывать свою функцию loadData ().
Вопрос
- Если я буду вызывать свою функцию loadData () каждый раз, когда мне нужно будет выполнить HTTP-запрос, я создам столько подписчиков?
- Есть ли риск утечки памяти?
- Если так, знаете ли вы, как я должен рефакторинг своего кода?
Ответ
Образцы кода
private loadData() {
this.loading = true;
const subscription = this.service.getData()
.pipe(
// console.log() with a delay added for test - START
map(val => {
window.setTimeout(() => {
// This will print true.
console.log('After delay: Is Subscriber closed?', subscription.closed);
}, 10);
return val;
}),
// console.log() with a delay added for test - END
takeUntil(this.ngUnsubscribe))
.subscribe(data => {
this.data = data;
// This will print false.
console.log('Is Subscriber closed?', subscription.closed);
},
error => {
console.error(error);
throw error;
},
() => {
this.loading = false;
});
}
getData(): Observable<DataObject> {
const uri = encodeURI(this.configService.getUri());
const headers = new HttpHeaders();
if (this.pipelineEtag) {
headers.set('If-None-Match', this.pipelineEtag);
}
return this.http.get(uri, {
headers: headers,
observe: 'response'
}).pipe(
map(resp => this.processResponse(resp)),
catchError(error => this.handleError(error, this.envProduction))
);
}