首页 > 解决方案 > 在继续之前等待单例服务结果 - 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
});

我不完全确定我是否正确地处理了这个问题,但我们将不胜感激。

标签: angulartypescriptobservable

解决方案


我认为您可以摆脱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每当任何组件订阅时,如果不存在,调用将转到端点。


推荐阅读