angular - 在继续之前等待单例服务结果 - Angular
问题描述
我有一个单例服务,它只是从端点获取用户。然后在需要的地方将用户注入到每个组件中。问题是在依赖于用户值的组件中还有其他函数要执行(即在执行所述函数之前等待用户值)。
在继续之前,我如何“等待”服务的值?这种等待显然只在应用程序的初始加载时是必需的,而单例已经为后续组件提供了它的实例。
服务组件:
userDetails:IEmployee = {};
constructor(private service: ServiceCaller) {
this.User().subscribe((x) => {
this.userDetails = x;
});
}
public User():Observable<IEmployee> {
if(this.userDetails == undefined){
return this.service.get('/some/url')
.map((resp: IResponse) => {
return resp.Response
});
}
else {
//How to return an observable of this.userDetails?
let obs = Observable.create((observer:any) => {
observer.next(this.userDetails);
});
return obs;
}
}
}
其他组件:
this.userService.User().subscribe((x) => {
//result empty
});
我不完全确定我是否正确地处理了这个问题,但我们将不胜感激。
解决方案
我认为您可以摆脱this.User()
服务构造函数中的调用。只需在您的类中定义一个变量userDetails
,就像您已经拥有的那样,并拥有您的User()
方法,例如:
public User():Observable<IEmployee> {
if(this.userDetails === undefined){
return this.service.get('/some/url')
.do((resp: IResponse) => {
this.userDetails = resp.Response
})
.map((resp: IResponse) => {
return resp.Response
});
}
else {
return Observable.of(this.userDetails)
}
}
userDetails
每当任何组件订阅时,如果不存在,调用将转到端点。
推荐阅读
- angular - .detectChanges() not working within Angular test
- r - 如果变量名称的格式不一致,如何更正/标准化变量名称
- spring-integration - 用于在流程中存储和检索的弹簧集成 dsl 流程变量
- algorithm - 寻找复杂性的下限和上限
- firebase - 每个设备和消息的 fcm 配额和限制
- javascript - 正则表达式在句子中定义捕获的组
- javascript - 根据从选择框中选择的值过滤特定的表列
- rest - 你什么时候说 Web 服务是一个完整的 RestFul Web 服务?
- php - __set_state() - php.net 上注释的解释
- java - 为什么每次在同一部手机上id都会改变?Firebase 数据库