【发布时间】:2017-11-08 00:02:37
【问题描述】:
我的服务中有以下代码:
public loginWithFacebook(): Observable<any> {
console.log('Login');
return Observable.fromPromise(this.fb.login()).flatMap((userData) => {
return this.http.post(authFacebook, {access_token: userData.authResponse.accessToken}, { observe: 'response' });
}).do( (response: HttpResponse<any>) => {
const token = response.headers.get('x-auth-token');
if (token) {
localStorage.setItem('id_token', token);
}
});
}
getFacebookProfile():Observable<any> {
console.log("Get Profile");
return Observable.fromPromise(this.fb.getLoginStatus())
.filter((state) => state.status === 'connected')
.switchMapTo(Observable.fromPromise(this.fb.api('/me')));
}
稍后我在我的组件中使用它来获取登录成功后的个人资料信息。
this.profileData = this.usersService.loginWithFacebook()
.flatMapTo(this.usersService.getFacebookProfile());
但是,由于某种原因,即使在登录过程完成之前,getFacebookProfile() 也会立即触发。我得到一个身份验证错误。另外,我必须登录两次才能显示个人资料信息。
我一直认为 switchMap 和 flatMap 只有在前一个发出值时才切换到下一个 observable。 我在这里做错了什么?
--编辑--
如果我订阅了第一个 Observable 并在订阅中调用 getFacebookProfile() ,一切正常。但我觉得这不是很优雅的解决方案。
【问题讨论】: