Это может быть вопрос noob, но я мог бы найти ссылку на него.
У меня есть два компонента, размещенные в разных местах, каждый компонент использует Сервис для запроса конечной точки и получения некоторых данных (например, пользователяпрофиль).
Служба возвращает наблюдаемое, мне нужно, чтобы наблюдаемое было уникальным или, по крайней мере, чтобы сделать уникальный запрос.
// Service, shared across multiple components
@Injectable()
export class SomeService {
getData(): Observable<DataModel> {
return this._http.get<DataResponse>('/some-route').pipe(
map((response: DataResponse) => this.handleResponse(response)),
share() // is this right ?
);
}
}
// Component requesting data
@Component({ selector: '...', ... })
export class FirstComponent implements OnInit {
constructor(private _service: SomeService) { }
ngOnInit() {
this._service.getData().subscribe(
data => {
console.log(data);
}
);
}
}
// Another component requesting the same data
@Component({ selector: '...', ... })
export class SecondComponent implements OnInit {
constructor(private _service: SomeService) { }
ngOnInit() {
this._service.getData().subscribe(
data => {
console.log(data);
}
);
}
}
Служба работает и получает данные, нозапрос отправляется дважды, я хочу отправить только один запрос.Компоненты работают одновременно (скажем, один вверху, а второй внизу экрана).Таким образом, они делают запрос одновременно.
Есть ли способ, которым служба отправила только один запрос?
И кстати, первый запрос имеет статус 200, а второй 304.
Спасибо.
ОБНОВЛЕНИЕ
Возможное решение
Пока мне удалось добавить переменную Service
private _observable: Observable<DataModel>;
Тогда при получении данных
getData(): Observable<DataModel> {
if (!this._observable) {
this._observable = this._http.get<DataResponse>('/some-route').pipe(
map((response: DataResponse) => this.handleResponse(response)),
// HERE IS THE TRICK
publishLast(),
refCount()
)
}
return this_observable;
}
Хитрость в использовании publishLast и refCount
Какой-нибудь лучший способ / идея?