Я хотел бы создать метод службы, который при первом выполнении будет извлекать набор данных из URL-адреса, кэшировать набор данных, а затем совместно использовать один и тот же экземпляр набора данных с компонентами, которые впоследствии вызывают метод службы.
Я начал создавать два решения. Проблема с обоими решениями заключается в том, что в первые миллисекунды после загрузки приложения Angular они несколько раз извлекают набор данных из URL-адреса и / или выдают на консоль некоторые сообщения об ошибках, но после первой или второй навигации между два компонента, данные, похоже, распределяются правильно, и больше нет обратного доступа к URL-адресу.
Подход №1
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class FirstService {
private url = 'http://somedummydomain.com/api/entries';
private data: any;
private observable: Observable<any>;
constructor(private http: HttpClient) {}
getData() : Observable<any> {
if (this.data) {
return of(this.data);
} else if (this.observable) {
return this.observable;
} else {
this.observable = this.http.get(this.url);
this.observable.subscribe((data) => {
this.data = data;
this.observable = null;
});
return this.observable;
}
}
}
Подход №2
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root',
})
export class SecondService {
private sharedData: BehaviorSubject<any> = new BehaviorSubject<any>(null);
private url = 'http://somedummydomain.com/api/entries';
constructor(private http: HttpClient) {
this.http.get(this.url).subscribe((data) => {
this.addData(data);
});
}
private addData(data: any) {
this.sharedData.next(data);
}
getData(): Observable<any> {
return this.sharedData.asObservable();
}
}
Версии Lib
- angular: v9.1.9
- rx js: v6.5.5
Спасибо!