Как загрузить для всего приложения запрос FireStore с подпиской - PullRequest
0 голосов
/ 24 января 2020

Я работаю над приложением с angular и firestore, которое требует загружать все данные в реальном времени из документа для всего приложения.

То есть, когда я прихожу на домашнюю страницу Мне нужны эти данные, в том же профиле и т. Д. c ... Около 7, 8 страниц.

У меня есть этот код, который работает довольно хорошо:

в службе:

getMyUser() {
 this.usersCollection.doc<User>(this.authentificationService.getUid()).valueChanges().subscribe(result => 
 {
   return result;
 });
}

в компоненте:

this.userData = this.usersService.getMyUser();

Однако при каждом входе на разные страницы возникает запрос. Если я просмотрю 8 страниц, которые требуют эти данные, он сделает 8 запросов. Я хотел бы найти решение сделать запрос только один раз с оперативными данными в службе, а затем отобразить данные на моих 8 различных страницах.

Есть ли решение?

Спасибо за ваш помощь.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Установите переменную в сервисе равной результату вызова getUser, затем получите переменную из сервиса вместо вызова getUser.

0 голосов
/ 24 января 2020

shareReplay должно работать на тот случай, о котором вы упомянули. Вы можете следовать этому руководству , и я оставлю небольшой пример.

import { Observable } from 'rxjs/Observable';
import { shareReplay, map } from 'rxjs/operators';

const CACHE_SIZE = <SIZE_FOR_YOUR_CACHE>;

////////
your additional code

//////////

private cache$: Observable<Array<User>>;

getMyUser() {
   if (!this.cache$) {
      this.cache$ = this.requestMyUser().pipe(
        shareReplay(CACHE_SIZE)
      );
   }
   return this.cache$; 
}

requestMyUser(){
   this.usersCollection.doc<User> 
   (this.authentificationService.getUid()).valueChanges().subscribe(result => 
      {
         return result;
   });
}

/////
Rest of your code

/////

...