如何通过订阅为整个应用程序加载 firestore 请求
How to load for the whole app a firestore request with a subscribe
我正在使用 angular 和 firestore 开发一个应用程序,它需要从文档中为整个应用程序实时加载所有数据。
也就是说,当我到达主页时,我需要这些数据,在相同的个人资料中,等等......大约 7、8 页。
我的这段代码运行良好:
在服务中:
getMyUser() {
this.usersCollection.doc<User>(this.authentificationService.getUid()).valueChanges().subscribe(result =>
{
return result;
});
}
在组件中:
this.userData = this.usersService.getMyUser();
但是,每次我进入不同的页面时都会发出请求。如果我浏览 8 个需要此数据的页面,它将发出 8 个请求。我想找到一个解决方案,只用服务中的实时数据发出一次请求,然后在我的 8 个不同页面中显示数据。
有解决办法吗?
感谢您的帮助。
shareReplay
应该适用于您提到的用例。你可以关注this guide,我也会留下一个简单的例子。
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
/////
在服务中设置一个变量等于 getUser 调用的结果,然后从服务中获取变量而不是调用 getUser。
我正在使用 angular 和 firestore 开发一个应用程序,它需要从文档中为整个应用程序实时加载所有数据。
也就是说,当我到达主页时,我需要这些数据,在相同的个人资料中,等等......大约 7、8 页。
我的这段代码运行良好:
在服务中:
getMyUser() {
this.usersCollection.doc<User>(this.authentificationService.getUid()).valueChanges().subscribe(result =>
{
return result;
});
}
在组件中:
this.userData = this.usersService.getMyUser();
但是,每次我进入不同的页面时都会发出请求。如果我浏览 8 个需要此数据的页面,它将发出 8 个请求。我想找到一个解决方案,只用服务中的实时数据发出一次请求,然后在我的 8 个不同页面中显示数据。
有解决办法吗?
感谢您的帮助。
shareReplay
应该适用于您提到的用例。你可以关注this guide,我也会留下一个简单的例子。
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
/////
在服务中设置一个变量等于 getUser 调用的结果,然后从服务中获取变量而不是调用 getUser。