等待单例服务结果后再继续-Angular

时间:2019-04-25 15:03:20

标签: angular observable

我有一个单例服务,它仅从端点获取用户。 然后将用户注入到需要的每个组件中。 问题在于,在依赖于用户值的组件中还有其他功能要执行(即,在执行所述功能之前等待用户值)。

我如何在继续之前从服务中“等待”值?显然,此等待仅在应用程序的初始加载时才需要,而singlton将已经具有其后继组件的实例。

服务组件:

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
});

我不确定我是否正确地解决了这个问题,但会有所帮助。

1 个答案:

答案 0 :(得分:0)

我认为您可以摆脱服务构造函数中的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还不存在,则呼叫将到达端点。